选中行并选中复选框

时间:2014-07-07 20:57:38

标签: c# winforms datagridview

我只需要显示行,其中选择“可用性”列(即复选框)。我怎样才能只选择那些行?

private void checkBox1_Checked {
   foreach (DataGridViewRow row in dataGridView1.Rows)
   {
       if (Convert.ToBoolean(row.Cells["availability"].Value) != true)
       {
           //row.Visible = false;
           //exception

                   ...

我尝试过像上面代码那样的事情,但它没有.visible属性

我的任务是在取消选中一个“main”复选框时删除所有未检查的行。但仅来自DataGridView,而不是来自DataSet。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用列表作为datagridview的数据源:

public class MyRecord
{
    public bool Availability { get; set; }
    public int Field1 { get; set; }
    public string Field2 { get; set; }
    ...
}

MyRecords = new BindingList<MyRecord>();

foreach (var row in dataSet1)
{
    MyRecords.Add(new MyRecord { Availability  = false, Field1 = ... });
    MyRecords.Add(new MyRecord { Availability  = false, Field1 = ... });
}

dataGridView1.DataSource = MyRecords;

然后你可以这样做:

var selectedRows = MyRecords.Where(r => r.Availability).ToList();
foreach (var item in selectedRows)
{
    MyRecords.Remove(item);
}

答案 1 :(得分:0)

据我了解,您希望保留Datagridview仅检查的行 我假设/希望datasource中的每一行都有一些唯一的ID值。 如果是这样,那么您可以获得已检查行的唯一ID列表

List<Int32> checkedRowID = this.datagridview1.Rows.Cast<DataGridViewRow>()
       .Where((rw) => Convert.ToBoolean(rw.Cells["availability"].Value) == true)
       .Select((row) => Convert.ToInt32(row.Cells["uniqueColumnName"].Value))
       .ToList();

然后,如果未选中“主要”复选框,请使用此列表过滤原始DataTable

if(maincheckbox.Checked != true)
    this.datagridview1.DataSource = originDataTable.AsEnumerable()
        .Where((dr) => checkedRowID.Contains(dr.Field<Int32>("uniqueColumnName")))
        .CopyToDataTable();
else
    this.datagridview1.DataSource = originDataTable;

或者您可以使用DataTable.Select方法进行过滤

String query = String.Format("uniqueColumnName IN ({0})",
                             String.Join(",", uniqueIDs ));
this.dgv.DataSource = dt.Select(query).CopyToDataTable();