C# DataGridView中的自定义搜索

C# DataGridView中的自定义搜索,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我正在创建一个程序,我需要在网格的每一列中搜索,但搜索文本框应该应用到DataGridView的一个单元格中。我的意思是 一个DataGridView,最上面的一行作为搜索行,它将在下面的数据中应用搜索 如以下示例所示: 这个DataGridView在第一行有搜索单元格,它将搜索应用到它下面的值。这是可以做到的,正如您在下面看到的,您所需要的代码并不多。但是您确实需要使用一些技巧,因此这里有一个示例,您可能需要学习: 它假定将DataGridView绑定到DataTable,并将allowU

我正在创建一个程序,我需要在网格的每一列中搜索,但搜索文本框应该应用到DataGridView的一个单元格中。我的意思是 一个DataGridView,最上面的一行作为搜索行,它将在下面的数据中应用搜索

如以下示例所示:


这个DataGridView在第一行有搜索单元格,它将搜索应用到它下面的值。

这是可以做到的,正如您在下面看到的,您所需要的代码并不多。但是您确实需要使用一些技巧,因此这里有一个示例,您可能需要学习

它假定将
DataGridView
绑定到
DataTable
,并将
allowUserToAddress
设置为false

您首先需要抓取编辑控件,通常是用户开始编辑时的
文本框

 DataGridViewTextBoxEditingControl editDgvEc = null;  // at class level!
我们在这一事件中抓住了它:

private void dataGridView1_EditingControlShowing(object sender,
                           DataGridViewEditingControlShowingEventArgs e)
{
    // unhook the old handle
    if (editDgvEc != null) editDgvEc.TextChanged -= editDgvEc_TextChanged;
    // store a reference
    editDgvEc = e.Control as DataGridViewTextBoxEditingControl;
    // hook up the TextChanged event
    editDgvEc.TextChanged += editDgvEc_TextChanged;
}
TextChanged
事件中,我们进行一些测试,然后选择所有配件行:

void editDgvEc_TextChanged(object sender, EventArgs e)
{
    if (dataGridView1.CurrentCell.RowIndex == 0)
    {
        int col = dataGridView1.CurrentCell.ColumnIndex;
        if (editDgvEc.Text == "") dataGridView1.ClearSelection();
        else
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (row.Index > 0)  row.Selected = 
                    row.Cells[col].Value.ToString().Contains(editDgvEc.Text);
            }
    }
}
因此,您可以在键入时查看选择过程。如果有很多行,您可能需要更改,可能需要从
CellEndEdit
事件中的单元格本身获取搜索文本,而不是从编辑文本框中获取搜索文本

最后,我们要设置搜索行。我们需要在填写
数据表dt
后执行此操作:

dataGridView1.DataSource = dt;
DataRow dr = dt.NewRow();
dt.Rows.InsertAt(dr, 0);
dataGridView1.Rows[0].Frozen = true;
dataGridView1.Rows[0].DividerHeight = 2;
dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.LightBlue;
为了获得更好的触感,我们可以对
CellPainting
事件进行编码,以绘制自定义
行标题

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex >= 0 || e.RowIndex != 0) return;
    e.Graphics.DrawString("$", new Font("Wingdings",11f), Brushes.Black, e.CellBounds);
    e.Handled = true;
}

如果您的DGV没有数据绑定,只需将搜索行直接添加到DGV,而不是将其添加到数据源,即可修改代码。

您的目标是什么:Winforms、WPF、ASP。。?始终正确标记您的问题!winforms。从现在起,我们将牢记这一点。嗨@OmerWaheed,欢迎来到Stack Overflow。要添加建议的标记,请单击编辑并将新标记添加到列表中(编辑摘要和保存按钮上方)。确定,在这种情况下:不要调用
DataGridView
a
GridView
DataGrid
!!这是错误和混乱的,因为这些是不同的控件。总是用正确的名字来称呼事物!是的,再打四个字母,所以请更正标签,好吗?如果你做对了,机会会大得多。。!您是否熟悉ItemTemplates。。?在谷歌上快速搜索如何在DataGridViews中嵌入文本框非常感谢!!!!。。。这正是我需要的。已证实的谢谢你