我正在C#Windows应用程序上工作,以将记录从SQL Server填充到数据网格视图,并在每行中使用动态复选框功能。我想通过特定行的复选框来出于某些目的选择选定的行。到目前为止,我已经成功实现了目标,但是在保存已检查状态方面遇到了一个小问题。
例如,我只想检查名称=最大值的那些记录。我在那个文本框中有一个文本框,我称文本更改事件为Query:
try
{
SqlCommand cmd = null;
SqlConnection con = null; Ranks rank = new Ranks();
con = new SqlConnection(cs.DBcon);
con.Open();
cmd = con.CreateCommand();
cmd.CommandText = "Select * from Records where Name like @Name order by Pno";
cmd.Parameters.AddWithValue("@Name", "%" + FilterByNameTextbox.Text.Trim() + "%");
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter1.Fill(dt);
dataGridView1.DataSource = dt;
Make_fields_Colorful();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
如果我在“按名称过滤器”文本框中编写Max,它将返回3条记录,其名称以max开头,就像我上面提到的代码一样,使用类似查询。因此,我仅使用动态复选框检查3条记录中的2条记录,直到现在我的代码都能完美运行。现在我要检查名称从Ali开始的记录,现在当我在名称过滤器中按名称文本框写ali时,它将返回行,其中的名称类似于ali,但是问题出在这里,它将删除我之前检查过的记录,因此我将如何保存max和ali行的检查记录:
用于在每行中添加动态复选框的代码
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn();
checkBoxColumn.Name = "checkBoxColumn";
checkBoxColumn.DataPropertyName = "Report";
checkBoxColumn.HeaderText = "Report";
dataGridView1.Columns.Insert(10, checkBoxColumn);
dataGridView1.RowTemplate.Height = 100;
dataGridView1.Columns[10].Width = 50;
图片:
答案 0 :(得分:0)
我建议您通过缓存选定的行来实现此目的,首先应该有一个缓存行的列表:
List<DataGridViewRow> CachedRows = new List<DataGridViewRow>();
然后在单元格值更改上添加事件处理程序,如下所示:
dataGridView1.CellValueChanged += view_CellValueChanged;
并且处理程序应检查是否已更改列为复选框并选中,应类似于以下内容:
try
{
if(e.ColumnIndex == indexOfCheckBoxColumn)
{
if((bool)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == true)
{
CachedRows.Add((DataGridViewRow)dataGridView1.Rows[e.RowIndex].Clone());
}
else if (CachedRows.Contains(dataGridView1.Rows[e.RowIndex]))//Validate if this works, if not you should associate each row with unique key like for example (id) using a dictionary
{
CachedRows.Remove(dataGridView1.Rows[e.RowIndex]);
}
}
}
catch(Exception ex)
{
}
然后,在更改过滤器之后,再次重新添加缓存的行,因此代码变为:
try
{
SqlCommand cmd = null;
SqlConnection con = null; Ranks rank = new Ranks();
con = new SqlConnection(cs.DBcon);
con.Open();
cmd = con.CreateCommand();
cmd.CommandText = "Select * from Records where Name like @Name order by Pno";
cmd.Parameters.AddWithValue("@Name", "%" + FilterByNameTextbox.Text.Trim() + "%");
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter1.Fill(dt);
dataGridView1.DataSource = dt;
//add folowing
if (CachedRows.Any())
{
dataGridView1.Rows.AddRange(CachedRows.ToArray());
CachedRows.Clear();
}
Make_fields_Colorful();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}