2016-11-11 1 views
1

Ich habe eine Datagridview in meinem Windows-Formular. Ich muss den Benutzern erlauben, die Spalten neu anzuordnen und dann die Änderungen dauerhaft speichern. Ich legte myGrid.AllowUserToOrderColumns = true; Dies ändert jedoch nur den Anzeigeindex für das Design.DataGridViews Spalten neu anordnen und die neue Position programmatisch speichern

+0

Bitte geben Sie weitere Informationen ein Beispiel: Was haben Sie versucht, das Design zu speichern, das der Benutzer verwenden möchte? – Mitja

+0

Ich habe noch nichts probiert. Ich habe keine Ahnung, wie ich das erreichen kann. Wenn ich die Eigenschaft 'AllowUserToOrderColumns' auf 'true' einstellte, änderte ich den Spaltenindex zur Laufzeit. Aber das änderte den Spaltenindex nicht durchgängig – Anjitha

Antwort

1

Entity:

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; 
} 

Der serializable Proxy:

[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; 
      } 
    } 
} 

Mein Form1 zum Testen:

 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; 
    } 
} 

Es wird die DataPropertyName und den Displayindex in eine XML-Datei speichern. Sie können es leicht erweitern/ändern, wo Ihre Daten gespeichert werden müssen, indem Sie Ihre benutzerdefinierten Speicher- und Lade-Methoden implementieren.

1

Sie im Mai dieses Jahres

Hilfe public partial class Form1: Form {

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 { } 
    } 
} 

}

Verwandte Themen