Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0222: Settings für Formen, Listview, Datagridview

 von 

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Fenster

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Settings, Forms, Listview, Datagridview, ColumnWidth,DisplayIndex

Der Vorschlag wurde erstellt am: 13.03.2008 17:38.
Die letzte Aktualisierung erfolgte am 23.10.2008 14:08.

Zurück zur Übersicht

Beschreibung  

Speichern und Wiederherstellen Forms Size+Location+Maximize/Normal, Spaltenbreiten im Listview und Datagridview über Einstellungen/Settings

Update 23.10.2008: Spaltenreihenfolge speichern und wiederherstellen

Schwierigkeitsgrad

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [16,61 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------- Anfang Projektdatei FormSettingsDemo.vbproj  -------
' ------------- Anfang Datei clsFormSettings.vb  -------------
' -------------------------------------------------------------------
'  clsFormSettings   VB2005
'  Klasse zum Speichern Form.Location, .Size, .Maximized
'  über die Projekt.Settings
'  ebenso ColumnsWidth und DiplayIndex von Listview und DataGridView
'
'  Autor       peter.k.sauer@web.de
'  Created     14.03.2008
'  Update      23.10.2008
' -------------------------------------------------------------------

''' <summary>
''' Funktionen zum Speichern und Restore von FormSize, -Location und Windowstate(Maximize)
''' </summary>
''' <remarks></remarks>
Public Class clsFormSettings

    Public Sub New()

    End Sub

    ''' <summary>
    ''' Form auf Basis gespeicherter Daten über Size und Location einstellen
    ''' </summary>
    ''' <param name="Frm">die Form</param>
    ''' <param name="Settings">Daten (String) aus den Einstellungen (Settings)</param>
    ''' <remarks></remarks>
    Public Sub FormRestore(ByVal Frm As Form, ByVal Settings As String)

        ' beim 1. Mal sind noch keine Settings vorhanden
        If String.IsNullOrEmpty(Settings) Then

            Exit Sub

        End If

        Dim s() As String = Settings.Split(","c)
        Dim Size As New Size(Integer.Parse(s(3)), Integer.Parse(s(4)))
        Dim Pt As New Point(Integer.Parse(s(1)), Integer.Parse(s(2)))
        Dim Rect As Rectangle = My.Computer.Screen.WorkingArea

        ' Maximalwerte beachten
        If Size.Width > Rect.Width Then
            Size.Width = Rect.Width
        End If

        If Size.Height > Rect.Height Then
            Size.Height = Rect.Height
        End If

        If Pt.Y < 0 Then
            Pt.Y = 0

        ElseIf Pt.Y > (Rect.Height - 30) Then

            Pt.Y = Rect.Height - 30
        End If

        If Pt.X < 0 Then
            Pt.X = 0

        ElseIf Pt.X > (Rect.Width - 30) Then

            Pt.X = Rect.Width - 30
        End If

        Frm.Location = Pt
        Frm.Size = Size

        If s(0) = "1" Then
            Frm.WindowState = FormWindowState.Maximized
        End If

    End Sub

    ''' <summary>
    ''' liefert die Daten von Size und Location einer Form in einem String
    ''' zum Abspeichern in den Einstellungen (Settings)
    ''' </summary>
    ''' <param name="Frm">die Form</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function FormGetSettings(ByVal Frm As Form) As String

        Dim s(4) As String

        If Frm.WindowState = FormWindowState.Normal Then
            s(0) = "0"
            s(1) = Frm.Left.ToString
            s(2) = Frm.Top.ToString
            s(3) = Frm.Width.ToString
            s(4) = Frm.Height.ToString

        Else

            If Frm.WindowState = FormWindowState.Maximized Then
                s(0) = "1"

            Else

                s(0) = "2"
            End If

            s(1) = Frm.RestoreBounds.X.ToString
            s(2) = Frm.RestoreBounds.Y.ToString
            s(3) = Frm.RestoreBounds.Width.ToString
            s(4) = Frm.RestoreBounds.Height.ToString
        End If

        Return String.Join(",", s)

    End Function

    ''' <summary>
    ''' stellt die Spaltenbreite in einem Datagridview wieder ein über ein
    ''' per ....GetSettings erzeugten String
    ''' </summary>
    ''' <param name="DGV"></param>
    ''' <param name="Settings"></param>
    ''' <remarks></remarks>
    Public Sub DGVColumnWidthRestore(ByVal DGV As DataGridView, ByVal Settings As String)

        If String.IsNullOrEmpty(Settings) Then

            Exit Sub

        End If

        Dim s() As String = Settings.Split(","c)

        If (s.GetUpperBound(0) + 1) = DGV.Columns.Count Then

            For i As Integer = 0 To s.GetUpperBound(0)
                DGV.Columns(i).Width = Convert.ToInt32(s(i))
            Next

        End If

    End Sub

    ''' <summary>
    ''' liefert die Spaltenbreiten in einem Datagridview in einem String
    ''' </summary>
    ''' <param name="DGV"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function DGVColumnWidthGetSettings(ByVal DGV As DataGridView) As String

        Using SR As New IO.StringWriter

            If DGV.Columns.Count > 0 Then

                For i As Integer = 0 To DGV.Columns.Count - 1
                    SR.Write("," & DGV.Columns(i).Width.ToString)
                Next

                Return SR.ToString.Substring(1)
            End If

            Return Nothing
        End Using

    End Function

    ''' <summary>
    ''' liefert die (vom User eingestellte) Spaltenreihenfolge
    ''' (DisplayIndex) in einem DataGridView als String
    ''' </summary>
    ''' <param name="DGV">das DataGridView</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function DGVColumnOrderGetSettings(ByVal DGV As DataGridView) As String

        Using SW As New IO.StringWriter

            If DGV.Columns.Count > 0 Then

                For i As Integer = 0 To DGV.Columns.Count - 1
                    SW.Write("," & DGV.Columns(i).DisplayIndex.ToString)
                Next

                Return SW.ToString.Substring(1)
            End If

        End Using

        Return Nothing

    End Function

    ''' <summary>
    ''' stellt die Spaltenreihenfolge in einem Datagridview wieder ein
    ''' </summary>
    ''' <param name="DGV">das DataGridView</param>
    ''' <param name="Settings">String aus den Settings</param>
    ''' <remarks></remarks>
    Public Sub DGVColumnsReOrder(ByVal DGV As DataGridView, ByVal Settings As String)

        If String.IsNullOrEmpty(Settings) Then

            Exit Sub

        End If

        Dim s() As String = Settings.Split(","c)

        If (s.GetUpperBound(0) + 1) = DGV.Columns.Count Then

            For i As Integer = 0 To DGV.Columns.Count - 1
                DGV.Columns(i).DisplayIndex = Convert.ToInt32(s(i))
            Next

        End If

    End Sub

    ''' <summary>
    ''' stellt die Spaltenbreite in einem Listview wieder ein über ein
    ''' per ....GetSettings erzeugten String
    ''' </summary>
    ''' <param name="Lvw"></param>
    ''' <param name="settings"></param>
    ''' <remarks></remarks>
    Public Sub ListviewColumnWidthRestore(ByVal Lvw As ListView, ByVal Settings As String)

        If String.IsNullOrEmpty(Settings) Then

            Exit Sub

        End If

        Dim s() As String = Settings.Split(","c)

        If (s.GetUpperBound(0) + 1) = Lvw.Columns.Count Then

            For i As Integer = 0 To s.GetUpperBound(0)
                Lvw.Columns(i).Width = Integer.Parse(s(i))
            Next

        End If

    End Sub

    ''' <summary>
    ''' liefert die Spaltenbreiten in einem Datagridview in einem String
    ''' </summary>
    ''' <param name="Lvw"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ListviewColumnWidthGetSettings(ByVal Lvw As ListView) As String

        Using SW As New IO.StringWriter

            If Lvw.Columns.Count > 0 Then

                For i As Integer = 0 To Lvw.Columns.Count - 1
                    SW.Write("," & Lvw.Columns(i).Width.ToString)
                Next

                Return SW.ToString.Substring(1)
            End If

            Return Nothing
        End Using

    End Function

    ''' <summary>
    ''' stellt in einem Listview über Settings 
    ''' die Spaltenreihenfolge ein (DisplayIndex)
    ''' </summary>
    ''' <param name="Lvw">das Listview</param>
    ''' <param name="Settings">String aus Settings</param>
    ''' <remarks></remarks>
    Public Sub ListviewColumnsReOrder(ByVal Lvw As ListView, ByVal Settings As String)

        If String.IsNullOrEmpty(Settings) Then

            Exit Sub

        End If

        Dim s() As String = Settings.Split(","c)

        If (s.GetUpperBound(0) + 1) = Lvw.Columns.Count Then

            For i As Integer = 0 To Lvw.Columns.Count - 1
                Lvw.Columns(i).DisplayIndex = Convert.ToInt32(s(i))
            Next

        End If

    End Sub

    ''' <summary>
    ''' liefert die Spaltenreihenfolge in einem Listview (DisplayIndex)
    ''' für die Speicherung in den Settings in einem String
    ''' </summary>
    ''' <param name="Lvw">das Listview</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ListviewColumnOrderGetSettings(ByVal Lvw As ListView) As String

        Using SW As New IO.StringWriter

            For i As Integer = 0 To Lvw.Columns.Count - 1
                SW.Write("," & Lvw.Columns(i).DisplayIndex.ToString)
            Next

            If Lvw.Columns.Count > 0 Then
                Return SW.ToString.Substring(1)
            End If

            Return Nothing
        End Using

    End Function

End Class

' -------------- Ende Datei clsFormSettings.vb  --------------
' ------------------ Anfang Datei Form1.vb  ------------------
Public Class Form1

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As _
        System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        ' Size, Location, WindowState der Form saven
        My.Settings.Form1Settings = FormSetting.FormGetSettings(Me)

        ' (vom User eingestellte) Spaltenbreiten des Listview saven
        My.Settings.Form1Lvw = FormSetting.ListviewColumnWidthGetSettings(ListView1)

        ' (vom User eingestellte) Spaltenreihenfolge des Listview saven
        My.Settings.Form1LvwReorder = FormSetting.ListviewColumnOrderGetSettings(ListView1)

        ' Einstellung in XML Datei schreiben
        My.Settings.Save()

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        ' Size, Location, Windowstate vom letzten Aufruf wiederherstellen
        FormSetting.FormRestore(Me, My.Settings.Form1Settings)

        With ListView1
            .View = View.Details

            For i As Integer = 0 To 10
                .Columns.Add("Spalte" & i.ToString)
            Next

            .AllowColumnReorder = True
        End With

        ' Spaltenbreiten im Listview vom letzten Aufruf wiederherstellen
        FormSetting.ListviewColumnWidthRestore(ListView1, My.Settings.Form1Lvw)

        ' Spaltenreihenfolge im Listview vom letzten Aufruf wiederherstellen
        FormSetting.ListviewColumnsReOrder(ListView1, My.Settings.Form1LvwReorder)

    End Sub

    ''' <summary>
    ''' Beispiel DataGridView starten
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles Button1.Click

        Using Frm As New Form2
            Frm.ShowDialog(Me)
        End Using

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' ------------------ Anfang Datei Form2.vb  ------------------
Public Class Form2

    Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As _
        System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

        ' Size, Location, WindowState der Form saven
        My.Settings.Form2Settings = FormSetting.FormGetSettings(Me)

        ' (vom User eingestellte) Spaltenbreiten saven
        My.Settings.Form2DGV = FormSetting.DGVColumnWidthGetSettings(DataGridView1)

        ' (vom User eingestellte) Spaltenreihenfolge saven
        My.Settings.Form2DGVReorder = FormSetting.DGVColumnOrderGetSettings(DataGridView1)

    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        ' Size, Location, WindowState vom letzten Aufruf wiederherstellen
        FormSetting.FormRestore(Me, My.Settings.Form2Settings)

        For i As Integer = 0 To 10

            Dim s As String = "Spalte" & i.ToString

            DataGridView1.Columns.Add(s, s)
        Next

        DataGridView1.AllowUserToResizeColumns = True
        DataGridView1.AllowUserToOrderColumns = True

        ' Spaltenbreiten vom letzten Aufruf wiederherstellen
        FormSetting.DGVColumnWidthRestore(DataGridView1, My.Settings.Form2DGV)

        ' Spaltenreihenfolge vom letzten Aufruf wiederherstellen
        FormSetting.DGVColumnsReOrder(DataGridView1, My.Settings.Form2DGVReorder)

    End Sub

End Class

' ------------------- Ende Datei Form2.vb  -------------------
' ----------------- Anfang Datei Module1.vb  -----------------
Module Module1

    Public FormSetting As New clsFormSettings

End Module

' ------------------ Ende Datei Module1.vb  ------------------
' -------- Ende Projektdatei FormSettingsDemo.vbproj  --------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.