2010-05-08 4 views
2

Я добавил datagridview в мое приложение для форм win, а также добавил CheckBox для маркировки строк. CheckBox работает так, как я ожидал, пока пользователь не сортирует DataGridView. После сортировки предыдущий выбор столбца флажка утерян.Выбор флажка DataGridView

Есть ли способ, которым я могу сделать свой datagridview, какую строку выбрать после сортировки?

ответ

4

У вас есть два варианта решения этой проблемы.

Первым и, возможно, самым простым является привязка столбца флажка к вашему источнику данных. Например, если вы используете DataTable в качестве источника данных, добавление булевского столбца создаст флажок в вашем DataGridView, который будет сортировать и не потерять проверенное состояние.

Если это не вариант, то другим способом решения проблемы является установка режима DataGridView на Virtual и сохранение кеша ваших значений.

Ознакомьтесь с отличным DataGridView FAQ для примера того, как это сделать. Я также при условии, что код, приведенный ниже, но не проверить справку:

private System.Collections.Generic.Dictionary<int, bool> checkState; 
private void Form1_Load(object sender, EventArgs e) 
{ 
    dataGridView1.AutoGenerateColumns = false; 
    dataGridView1.DataSource = customerOrdersBindingSource; 

    // The check box column will be virtual. 
    dataGridView1.VirtualMode = true; 
    dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn()); 

    // Initialize the dictionary that contains the boolean check state. 
    checkState = new Dictionary<int, bool>(); 
} 
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
{ 
    // Update the status bar when the cell value changes. 
    if (e.ColumnIndex == 0 && e.RowIndex != -1) 
    { 
     // Get the orderID from the OrderID column. 
     int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value; 
     checkState[orderID] = (bool)dataGridView1.Rows[e.RowIndex].Cells[0].Value; 
    }  
} 

private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) 
{ 
    // Handle the notification that the value for a cell in the virtual column 
    // is needed. Get the value from the dictionary if the key exists. 

    if (e.ColumnIndex == 0) 
    { 
     int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value; 
     if (checkState.ContainsKey(orderID)) 
      e.Value = checkState[orderID]; 
     else 
      e.Value = false; 
    } 

} 

private void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e) 
{ 
    // Handle the notification that the value for a cell in the virtual column 
    // needs to be pushed back to the dictionary. 

    if (e.ColumnIndex == 0) 
    { 
     // Get the orderID from the OrderID column. 
     int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value; 

     // Add or update the checked value to the dictionary depending on if the 
     // key (orderID) already exists. 
     if (!checkState.ContainsKey(orderID)) 
     { 
      checkState.Add(orderID, (bool)e.Value); 
     } 
     else 
      checkState[orderID] = (bool)e.Value; 
    } 
} 
+0

Thanx on answer также FAQ, Вы правы о привязке логического столбца к datasource, еще один вопрос? Должен ли я переносить булевский столбец из исходного источника данных (StoredProc), или лучше добавить его на уровне клиента, прежде чем привязывать данные к моей сетке – adopilot

1

Я удивлен, что это происходит, но если в худшем случае нет другого пути, вы можете настроить сортировку на программную, а затем обработать, когда пользователь нажимает на заголовок столбца, сохраните список, из которых проверьте, выполните сортировку программно, а затем проверьте все элементы, которые необходимо проверить.

+0

Я тоже был удивлен, В пихты я думал, что я делаю что-то неправильно, то я финансировать эту статью Http: //www.dotnetspark. com/kb/Content.aspx? id = 151 и выявить то же поведение DataGridView – adopilot

Смежные вопросы