| |
VB.NET - Ein- und UmsteigerDGV-Spaltenreihenfolge speichern/lesen | | | Autor: stefanbla80 | Datum: 06.11.20 15:38 |
| Hallo zusammen,
ich habe folgendes "Phänomen" welche ich aktuell nicht nachvollziehen.
Ich habe ein DataGridView mit 90 Spalten.
Die User haben die Möglichkeit die Spaltenpositionen zu verändern (DisplayIndex).
Beim Schließen des Tools werden die Einstellungen in eine XML gespeichert, beim Öffnen wird diese gelesen.
Mit folgendem Code kann ich die Einstellungen in eine XML-Datei speichern.
XML-Datei
<?xml version="1.0" encoding="utf-8"?>
<DGVSettings>
<Column_0>
<HeaderText>ID</HeaderText>
<DisplayIndex>0</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_0>
<Column_1>
<HeaderText>Country</HeaderText>
<DisplayIndex>1</DisplayIndex>
<Width>75</Width>
<Visible>true</Visible>
</Column_1>
<Column_2>
<HeaderText>Customer</HeaderText>
<DisplayIndex>3</DisplayIndex>
<Width>115</Width>
<Visible>true</Visible>
</Column_2>
<Column_3>
<HeaderText>Customer acc. no</HeaderText>
<DisplayIndex>5</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_3>
<Column_4>
<HeaderText>Contact comp. name</HeaderText>
<DisplayIndex>6</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_4>
... Phänomen:
Die Spalten "wandern" teils eins nach recht - mit jedem öffnen.
Aber eben nicht all, sondern nur teilweise welche die ich nach vorne schiebe.
Grüße
Stefan | |
Re: DGV-Spaltenreihenfolge speichern/lesen | | | Autor: stefanbla80 | Datum: 06.11.20 15:38 |
| Nachtrag
Public Sub WriteSettingsDGV()
Me.CheckDGVSettingsXML()
Dim xml_Doc As XmlDocument
Dim xml_NodeWrite As XmlNode
If IO.File.Exists(DGVSettingsXML_User) Then
xml_Doc = New XmlDocument()
xml_Doc.Load(DGVSettingsXML_User)
For i As Integer = 0 To PlanningGuideDataDataGridView.Columns.Count _
- 1
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/HeaderText") Is Nothing = False) Then
xml_NodeWrite = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/HeaderText")
xml_NodeWrite.InnerText = _
Me.PlanningGuideDataDataGridView.Columns( _
i).HeaderText.ToString()
End If
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/DisplayIndex") Is Nothing = False) Then
xml_NodeWrite = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/DisplayIndex")
xml_NodeWrite.InnerText = _
Me.PlanningGuideDataDataGridView.Columns(i).DisplayIndex
End If
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/Width") Is Nothing = False) Then
xml_NodeWrite = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/Width")
xml_NodeWrite.InnerText = _
Me.PlanningGuideDataDataGridView.Columns(i).Width.ToString
End If
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/Visible") Is Nothing = False) Then
xml_NodeWrite = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/Visible")
If Me.PlanningGuideDataDataGridView.Columns(i).Visible = _
True Then
xml_NodeWrite.InnerText = "true"
Else
xml_NodeWrite.InnerText = "false"
End If
End If
Next
xml_Doc.Save(DGVSettingsXML_User)
Else
MsgBox("There is no 'PlanningGuide_DGVSettings-File' available." & _
"Please contact your administrator!")
End If
End Sub
Public Sub ReadSettingsDGV()
Me.CheckDGVSettingsXML()
Dim xml_Doc As XmlDocument
Dim xml_NodeLoad As XmlNode
If IO.File.Exists(DGVSettingsXML_User) Then
xml_Doc = New XmlDocument()
xml_Doc.Load(DGVSettingsXML_User)
For i As Integer = 0 To PlanningGuideDataDataGridView.Columns.Count _
- 1
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/DisplayIndex") Is Nothing = False) Then
xml_NodeLoad = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/DisplayIndex")
'Me.PlanningGuideDataDataGridView.Columns(i).DisplayIndex =
' xml_NodeLoad.FirstChild.Value
Me.PlanningGuideDataDataGridView.Columns(i).DisplayIndex = _
xml_NodeLoad.InnerText
End If
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/Width") Is Nothing = False) Then
xml_NodeLoad = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/Width")
Me.PlanningGuideDataDataGridView.Columns(i).Width = _
xml_NodeLoad.FirstChild.Value
End If
If (xml_Doc.SelectSingleNode("DGVSettings/Column_" & CStr(i) & _
"/Visible") Is Nothing = False) Then
xml_NodeLoad = xml_Doc.SelectSingleNode( _
"DGVSettings/Column_" & CStr(i) & "/Visible")
Me.PlanningGuideDataDataGridView.Columns(i).Visible = _
xml_NodeLoad.FirstChild.Value
End If
Next
Else
MsgBox("There is no 'PlanningGuide_DGVSettings-File' available." & _
"Please contact your administrator!")
End If
End Sub
Private Sub CheckDGVSettingsXML()
If IO.File.Exists(DGVSettingsXML_User) Then
Exit Sub
Else
IO.File.Copy(DGVSettingsXML_Master, DGVSettingsXML_User)
End If
End Sub | |
Re: DGV-Spaltenreihenfolge speichern/lesen | | | Autor: effeff | Datum: 06.11.20 18:37 |
| Bist Du sicher, dass Deine XML-Datei den Konventionen entspricht?
<?xml version="1.0" encoding="utf-8"?>
<DGVSettings>
<Column_0>
<HeaderText>ID</HeaderText>
<DisplayIndex>0</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_0>
<Column_1>
<HeaderText>Country</HeaderText>
<DisplayIndex>1</DisplayIndex>
<Width>75</Width>
<Visible>true</Visible>
</Column_1>
<Column_2>
<HeaderText>Customer</HeaderText>
<DisplayIndex>3</DisplayIndex>
<Width>115</Width>
<Visible>true</Visible>
</Column_2>
<Column_3>
<HeaderText>Customer acc. no</HeaderText>
<DisplayIndex>5</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_3>
<Column_4>
<HeaderText>Contact comp. name</HeaderText>
<DisplayIndex>6</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column_4>
... Müsste es nicht eher so aussehen:
<?xml version="1.0" encoding="utf-8"?>
<DGVSettings>
<Column>
<ID>0</ID>
<HeaderText>ID</HeaderText>
<DisplayIndex>0</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column>
<Column>
<ID>1</ID>
<HeaderText>Country</HeaderText>
<DisplayIndex>1</DisplayIndex>
<Width>75</Width>
<Visible>true</Visible>
</Column>
<Column>
<ID>2</ID>
<HeaderText>Customer</HeaderText>
<DisplayIndex>3</DisplayIndex>
<Width>115</Width>
<Visible>true</Visible>
</Column>
<Column>
<ID>3</ID>
<HeaderText>Customer acc. no</HeaderText>
<DisplayIndex>5</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column>
<Column>
<ID>4</ID>
<HeaderText>Contact comp. name</HeaderText>
<DisplayIndex>6</DisplayIndex>
<Width>25</Width>
<Visible>true</Visible>
</Column>
... So nach dem Beispiel von https://docs.microsoft.com/de-de/dotnet/api/system.xml.xmlnode.selectsinglenode?view=netcore-3.1
EALA FREYA FRESENA | |
Re: DGV-Spaltenreihenfolge speichern/lesen | | | Autor: effeff | Datum: 06.11.20 18:38 |
| Also... Ohne XML funktioniert auch eine einfache Textdatei für die Settings:
Public Class Form1
Dim dtDataTable As New DataTable
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dtDataTableInitialisieren()
DatensaetzeErzeugen()
DataGridView1Initialisieren()
End Sub
Private Sub DataGridView1Initialisieren()
With DataGridView1
.DataSource = dtDataTable
'.ReadOnly = True
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
.ScrollBars = ScrollBars.Both
.RowsDefaultCellStyle.BackColor = Color.White
.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
.AllowUserToOrderColumns = True
End With
End Sub
Private Sub dtDataTableInitialisieren()
dtDataTable = New DataTable
dtDataTable.TableName = "Tabelle"
Dim keys(1) As DataColumn
Dim column As New DataColumn
column.DataType = System.Type.GetType("System.Int32")
With column
.ColumnName = "ID"
.AutoIncrement = True
.AutoIncrementStep = 1
End With
dtDataTable.Columns.Add(column)
keys(0) = column
dtDataTable.PrimaryKey = keys
column = New DataColumn
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Ort"
dtDataTable.Columns.Add(column)
column = New DataColumn
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Land"
dtDataTable.Columns.Add(column)
column = New DataColumn
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Kontinent"
dtDataTable.Columns.Add(column)
column = New DataColumn
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Status"
dtDataTable.Columns.Add(column)
End Sub
Private Sub DatensaetzeErzeugen()
dtDataTable.Rows.Add(Nothing, "Hamburg", "Deutschland", "Europa", _
"unerledigt")
dtDataTable.Rows.Add(Nothing, "München", "Bayern", "Europa", "erledigt")
dtDataTable.Rows.Add(Nothing, "Karlsruhe", "Deutschland", "Eruopa", _
"unerledigt")
dtDataTable.Rows.Add(Nothing, "New York", "USA", "Nordamerika", _
"erledigt")
dtDataTable.Rows.Add(Nothing, "Nairobi", "Kenia", "Afrika", _
"unerledigt")
dtDataTable.Rows.Add(Nothing, "Moskau", "Russland", "Europa", _
"erledigt")
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Dim i As Integer
Dim sw As New System.IO.StreamWriter("d:\test\columnsettings.txt")
For i = 0 To DataGridView1.Columns.Count - 1
Dim col As DataGridViewColumn = DataGridView1.Columns(i)
sw.WriteLine(i & ";" & col.DisplayIndex & ";" & col.Width & ";" & _
col.Visible)
Next
sw.Close()
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles _
Button2.Click
Dim sr As New System.IO.StreamReader("D:\test\columnsettings.txt")
Dim line As String = ""
Do While (sr.Peek() >= 0)
line = sr.ReadLine
Dim arr() As String = line.Split(";")
Dim iCol As Integer = CInt(arr(0))
Dim iPos As Integer = CInt(arr(1))
Dim iWidth As Integer = CInt(arr(2))
Dim bVisible As Boolean = arr(3)
Dim col As DataGridViewColumn = DataGridView1.Columns(iCol)
With col
.DisplayIndex = iPos
.Width = iWidth
.Visible = bVisible
End With
Loop
sr.Close()
End Sub
End Class EALA FREYA FRESENA | |
Re: DGV-Spaltenreihenfolge speichern/lesen | | | Autor: stefanbla80 | Datum: 07.11.20 09:27 |
| Hallo effeff,
Meiner Meinung nach und nach meinen Tests stimmt die XML bzw. der Code um diese zu schreiben und zu lesen. Das funktioniert ja auch alles.
Ich habe lediglich das Phänomen, dass wenn ich z. B.
- Column_17 per Drag%Drop zwischen z. B. Column_5 und Column_6 schiebe
- anschließend dieses Setting abspeichere (mit Form_Closing erfolgt das)
- das Tool danach wieder öffne
=> dass dann die verschobene Spalte um eine Spalte nach rechts rückt.
Also dann nicht mehr zwischen 5 und 6 plaziert ist sondern zwischen 6 und 7.
Speichere ich dieses Setting erneut (was mit Form_Closing erfolgt) und öffne dann wieder das Tool, ich wieder einen "Offset" von +1 habe und somit wieder die verschobene Spalte eins nach rechts rückt - dann sich also zwischen 7 und 8 befindet.
Komischerweise ist das nicht be allen verschobenen Spalten so, sondern nur bei ein paar ...
Grüße
Stefan | |
Re: DGV-Spaltenreihenfolge speichern/lesen | | | Autor: stefanbla80 | Datum: 07.11.20 09:28 |
| Danke effeff,
werde ich mir am Wochenende anschauen.
Schön wäre eine XML - ist schöner zu lesen und deswegen mein Ansatz (siehe oben).
Grüße
Stefan | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|