2016-11-11 75 views
1

我在Windows窗体中有一个datagridview。我需要允许用户重新排序列,然后保存更改permanantly.I设置 myGrid.AllowUserToOrderColumns = true; 但这只会改变设计上的显示索引。重新排序DatagridViews列并以编程方式保存新位置

+0

请提供更多信息例如:您尝试保存用户希望使用的设计的是什么? – Mitja

+0

我还没有尝试过任何东西。我不知道如何实现this.setting属性的'AllowUserToOrderColumns'为真允许我在运行时更改列索引。但这并没有改变列索引的渗透性 – Anjitha

回答

1

实体:

public class Customer : INotifyPropertyChanged 
{ 
    string _firstname = ""; 

    public string Firstname 
    { 
     get { return _firstname; } 
     set { _firstname = value; OnPropertyChanged("Firstname"); } 
    } 
    string _lastname = ""; 

    public string Lastname 
    { 
     get { return _lastname; } 
     set { _lastname = value; OnPropertyChanged("Lastname"); } 
    } 
    int _age = 0; 

    public int Age 
    { 
     get { return _age; } 
     set { _age = value; OnPropertyChanged("Age"); } 
    } 
    public Customer() 
    { 

    } 
    protected void OnPropertyChanged(string name) 
    { 
     var handler = PropertyChanged; 

     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(name)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

的序列化代理:

[Serializable] 
public class DataGridViewColumnProxy 
{ 
    string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
    int _index; 

    public int Index 
    { 
     get { return _index; } 
     set { _index = value; } 
    } 

    public DataGridViewColumnProxy(DataGridViewColumn column) 
    { 
     this._name = column.DataPropertyName; 
     this._index = column.DisplayIndex; 
    } 
    public DataGridViewColumnProxy() 
    { 
    } 
} 
[Serializable] 
public class DataGridViewColumnCollectionProxy 
{ 
    List<DataGridViewColumnProxy> _columns = new List<DataGridViewColumnProxy>(); 
    public List<DataGridViewColumnProxy> Columns 
    { 
     get { return _columns; } 
     set { _columns = value; } 
    } 
    public DataGridViewColumnCollectionProxy(DataGridViewColumnCollection columnCollection) 
    { 
     foreach (var col in columnCollection) 
     { 
      if (col is DataGridViewColumn) 
       _columns.Add(new DataGridViewColumnProxy((DataGridViewColumn)col)); 
     } 
    } 
    public DataGridViewColumnCollectionProxy() 
    { 
    } 
    public void SetColumnOrder(DataGridViewColumnCollection columnCollection) 
    { 
     foreach (var col in columnCollection) 
      if (col is DataGridViewColumn) 
      { 
       DataGridViewColumn column = (DataGridViewColumn)col; 
       DataGridViewColumnProxy proxy = this._columns.FirstOrDefault(p => p.Name == column.DataPropertyName); 
       if (proxy != null) 
        column.DisplayIndex = proxy.Index; 
      } 
    } 
} 

我Form1中进行测试:

 public partial class Form1 : Form 
{ 
    BindingSource _customers = GetCustomerList(); 

    public BindingSource Customers 
    { 
     get { return _customers; } 
     set { _customers = value; } 
    } 
    public Form1() 
    { 
     InitializeComponent(); 
     dataGridView1.DataSource = Customers; 
     LoadDataGridOrderFromFile("myDataGrid.xml", dataGridView1.Columns); 
    } 
    private static BindingSource GetCustomerList() 
    { 
     BindingSource customers = new BindingSource(); 
     customers.Add(new Customer() { Firstname = "John", Lastname = "Doe", Age = 28 }); 
     customers.Add(new Customer() { Firstname = "Joanne", Lastname = "Doe", Age = 25 }); 
     return customers; 
    } 
    static object fileAccessLock = new object(); 
    private static void SaveDataGridOrderToFile(string path, DataGridViewColumnCollection colCollection) 
    { 

     lock (fileAccessLock) 
     using (FileStream fs = new FileStream(path, FileMode.Create)) 
     { 
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(DataGridViewColumnCollectionProxy)); 
      xmlSerializer.Serialize(fs, new DataGridViewColumnCollectionProxy(colCollection)); 
     } 
    } 
    private static void LoadDataGridOrderFromFile(string path, DataGridViewColumnCollection colCollection) 
    { 
     if (File.Exists(path)) 
     { 
      lock (fileAccessLock) 
       using (FileStream fs = new FileStream(path, FileMode.Open)) 
      { 
       XmlSerializer xmlSerializer = new XmlSerializer(typeof(DataGridViewColumnCollectionProxy)); 
       DataGridViewColumnCollectionProxy proxy = (DataGridViewColumnCollectionProxy)xmlSerializer.Deserialize(fs); 
       proxy.SetColumnOrder(colCollection); 
      } 
     } 
    } 

    private void dataGridView1_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e) 
    { 
     SaveDataGridOrderToFile("myDataGrid.xml", dataGridView1.Columns); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     dataGridView1.ColumnDisplayIndexChanged +=dataGridView1_ColumnDisplayIndexChanged; 
    } 
} 

这将DataPropertyName和的DisplayIndex保存到一个XML文件。通过实施自定义的保存和加载方法,您可以轻松地在必须存储数据的位置进行扩展/修改。

1

这可能会帮助你

公共部分Form1类:表格{

public Form1() 
{ 
    InitializeComponent(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    m_Grid.AllowUserToOrderColumns = true; 
    SetDisplayOrder(); 
} 

private void OnFormClosing(object sender, FormClosingEventArgs e) 
{ 
    CacheDisplayOrder(); 
} 

private void CacheDisplayOrder() 
{ 
    IsolatedStorageFile isoFile = 
     IsolatedStorageFile.GetUserStoreForAssembly(); 
    using (IsolatedStorageFileStream isoStream = new 
     IsolatedStorageFileStream("DisplayCache", FileMode.Create, 
     isoFile)) 
    { 
     int[] displayIndices =new int[m_Grid.ColumnCount]; 
     for (int i = 0; i < m_Grid.ColumnCount; i++) 
     { 
     displayIndices[i] = m_Grid.Columns[i].DisplayIndex; 
     } 
     XmlSerializer ser = new XmlSerializer(typeof(int[])); 
     ser.Serialize(isoStream,displayIndices); 
    } 
} 

private void SetDisplayOrder() 
{ 
    IsolatedStorageFile isoFile = 
     IsolatedStorageFile.GetUserStoreForAssembly(); 
    string[] fileNames = isoFile.GetFileNames("*"); 
    bool found = false; 
    foreach (string fileName in fileNames) 
    { 
     if (fileName == "DisplayCache") 
     found = true; 
    } 
    if (!found) 
     return; 
    using (IsolatedStorageFileStream isoStream = new 
     IsolatedStorageFileStream("DisplayCache", FileMode.Open, 
     isoFile)) 
    { 
     try 
     { 
     XmlSerializer ser = new XmlSerializer(typeof(int[])); 
     int[] displayIndicies = 
      (int[])ser.Deserialize(isoStream); 
     for (int i = 0; i < displayIndicies.Length; i++) 
     { 

      m_Grid.Columns[i].DisplayIndex = displayIndicies[i]; 

     } 
     } 
     catch { } 
    } 
} 

}

相关问题