我只需要显示行,其中选择“可用性”列(即复选框)。我怎样才能只选择那些行?
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。
答案 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();