如何使用复选框控制 DataGridView 中所选项目的顺序?

Squ*_*.98 5 c# winforms

目标

目前正在寻找一种方法,如何从 DataGridView 中选择项目并按顶部选择的第一个进行排序。

例子

用户的第一个选择:

Selected  Column1 Column2
             a       1
             b       2
             c       3
   x         d       4
Run Code Online (Sandbox Code Playgroud)

第二次选择...

Selected  Column1 Column2
             a       1
   x         b       2
             c       3
   x         d       4
Run Code Online (Sandbox Code Playgroud)

第三次选择...

Selected  Column1 Column2
   x          a      1
   x          b      2
              c      3
   x          d      4
Run Code Online (Sandbox Code Playgroud)

命令

4th row 
2nd row
1st row
Run Code Online (Sandbox Code Playgroud)

概括

用户选择的第一个项目是第 4 行,然后是第 2 行,最后是第 1 行。

如何按上述顺序获取所有行的列表?

当前代码

我像这样创建了一个复选框列,这样用户就可以看到他们选择了什么。

DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.Name = "Selected";
checkBoxColumn.HeaderText = "Selected";
checkBoxColumn.ReadOnly = false;
productsView.Columns.Add(checkBoxColumn);
Run Code Online (Sandbox Code Playgroud)

用户然后选中复选框以标记他们想要的所选记录,然后他们单击一个按钮打开另一个表单。

但顺序是混合的。

private void addBtn_Click(object sender, EventArgs e)
{

    foreach (var row in checkedRows)
    {
        DateTime dateTime = dateText.Value;
        string orderNumber = orderNumberText.Text;
    
        SelectedProducts form = new SelectedProducts(dateTime, orderNumber);
        form.ShowDialog();
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 3

我想我会:

  1. 创建一个新列表,根据新订单存储我的数据。

    List<Item> SelectedItemList= new List<Item>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 监听复选框列值的变化。选中复选框时添加到“SelectedList”,未选中时将其删除。(如何检测 DataGridView CheckBox 事件更改?

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (dataGridView1.Rows.Count > 0)
        {
            if ((bool)dataGridView1.SelectedRows[0].Cells[2].Value) //the index of checkbox column
               SelectedItemList.Add(itemBindingSource.current as Item)//add data to the list
            else
               SelectedItemList.Remove(itemBindingSource.current as Item) // remove data to list
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后使用该列表作为表单显示的参数。

    SelectedProducts form = new SelectedProducts(SelectedItemList);
    form.ShowDialog();
    
    Run Code Online (Sandbox Code Playgroud)