保存DataGridView的“AllowUserToOrderColumns”的设置

时间:2009-06-28 21:50:37

标签: c# .net datagridview

有没有办法让我的程序记住列重新排序的方式,所以当重新打开应用程序时,它会以与关闭表单时相同的方式对它们进行排序。我找不到任何属性。

感谢。

4 个答案:

答案 0 :(得分:2)

假设您正在讨论Windows窗体DataGridView,我不知道任何属性会自动为您执行此操作。我想你可以通过处理ColumnDisplayIndexChanged事件来设计一个非常简单的方案。每当用户更改列的顺序时,将触发此事件,然后您可以将列顺序保存在XML文件中。首次使用DataGridView创建表单时,您需要从文件中读取数据并为每列设置正确的DisplayIndex。

希望有所帮助,

-Dan

答案 1 :(得分:2)

            var query = from DataGridViewColumn col in dataGridView1.Columns
                        orderby col.DisplayIndex
                        select col;

            foreach (DataGridViewColumn col in query)
            {

                MessageBox.Show(col.HeaderText);
                MessageBox.Show(col.DisplayIndex.ToString());
             }

答案 2 :(得分:1)

如果您不想编写自己的逻辑,可以使用DataTable的功能将其数据或模式读/写到xml文件。
如果您关闭表单,只需创建一个DataTable,按正确的顺序为每个DataGridView添加列,并在启动时加载此模式并设置列的顺序:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    }

    // Save order
    private void button1_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable("table");

        var query = from DataGridViewColumn col in dataGridView1.Columns
                    orderby col.DisplayIndex
                    select col;

        foreach (DataGridViewColumn col in query)
        {
            dt.Columns.Add(col.Name);
        }

        dt.WriteXmlSchema(@"c:\temp\columnorder.xml");
    }

    // Restore order
    private void button2_Click(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.ReadXmlSchema(@"c:\temp\columnorder.xml");

        int i = 0;
        foreach (DataColumn col in dt.Columns)
        {
            dataGridView1.Columns[col.ColumnName].DisplayIndex = i;
            i++;
        }
    }
}

答案 3 :(得分:0)

我知道这个答案来得很晚但也许会帮助有需要的人。

我发现工作原理 - 非常简单并保存为设置

我创建了一个新的类库项目,以添加到我的解决方案中,并将其命名为MySettingTypes。 我添加了以下课程。

<Serializable()> Public Class DataGridViewColumnSetting
Property ColumnNames As List(Of String)
Property ColumnDisplayIndex As List(Of Integer)
Property ColumnVisiblility As List(Of Boolean)
Property ColumnSize As List(Of Integer)

Public Sub New()
    ColumnDisplayIndex = New List(Of Integer)
    ColumnNames = New List(Of String)
    ColumnSize = New List(Of Integer)
    ColumnVisiblility = New List(Of Boolean)
End Sub

结束班

重建MySettingTypes项目 将其添加为DatagridView项目的引用。 在包含项目的窗口中,您可以添加用于保存和加载的代码。

转到项目设置并添加名为YourDGVSettingsEntry的新设置。 选择类型时,转到BROWSE并在MySettingTypes下找到DataGridViewColumnSetting。

 Private Sub loadSettings()
    If Not IsNothing(My.Settings.YourDGVSettingsEntry) Then
        Dim s As MySettingTypes.DataGridViewColumnSetting = My.Settings.YourDGVSettingsEntry
        Dim pos As Integer = 0
        For Each ColumnName As String In s.ColumnNames
            Try
                Me.YourDataGridView.Columns(ColumnName).DisplayIndex = s.ColumnDisplayIndex(pos)
                Me.YourDataGridView.Columns(ColumnName).Width = s.ColumnSize(pos)
                Me.YourDataGridView.Columns(ColumnName).Visible = s.ColumnVisiblility(pos)
            Catch ex As Exception
            End Try
            pos = pos + 1
        Next

    Else
        My.Settings.YourDGVSettingsEntry = New MySettingTypes.DataGridViewColumnSetting
        Me.saveSettings()
    End If
End Sub

Private Sub saveSettings()
    Dim x As New MySettingTypes.DataGridViewColumnSetting
    For Each c As DataGridViewColumn In YourDataGridView.Columns
        x.ColumnNames.Add(c.Name)
        x.ColumnDisplayIndex.Add(c.DisplayIndex)
        x.ColumnSize.Add(c.Width)
        x.ColumnVisiblility.Add(c.Visible)
        My.Settings.YourDGVsettingsEntry = x
        My.Settings.Save()
    Next

End Sub

Private Sub yourDGVForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    'txtResultsCount.Text = "Saving settings"
    saveSettings()
End Sub

Private Sub yourDGVForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' myparent = Me.MdiParent
    loadSettings()
    'Setup()


End Sub

这很容易,并且已经将这些设置导入我的新版本。我即将添加 最终用户可以根据需要自定义列标题的能力。