使用文本框过滤记录时保持复选框的状态

时间:2019-02-12 06:35:43

标签: c# winforms

我正在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;

图片:

Image 1

Image 2

1 个答案:

答案 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);
    }