C# 如何使用复选框在单个Gridview中合并多个行筛选器记录

C# 如何使用复选框在单个Gridview中合并多个行筛选器记录,c#,asp.net,gridview,dataview,rowfilter,C#,Asp.net,Gridview,Dataview,Rowfilter,我想根据复选框中提到的特定条件,从gridview中上载的excel文件中检索特定记录。当选中一个复选框时,我的代码可以很好地工作,但如果选择了多个复选框,它不会响应/搜索记录,并且只基于一个复选框在gridview中显示记录。据我所知,它与“Rowfilter”属性有关 以下是我在搜索按钮中的代码 private void Btn_Search_Click(object sender, EventArgs e) { dt = Form1.dataRecord;

我想根据复选框中提到的特定条件,从gridview中上载的excel文件中检索特定记录。当选中一个复选框时,我的代码可以很好地工作,但如果选择了多个复选框,它不会响应/搜索记录,并且只基于一个复选框在gridview中显示记录。据我所知,它与“Rowfilter”属性有关

以下是我在搜索按钮中的代码

private void Btn_Search_Click(object sender, EventArgs e)
 {
             dt = Form1.dataRecord;
             DataView dv = new DataView(dt);
             foreach (DataRow dr in dt.Rows)
             {
                 if (Chk_CoS != null & Chk_CoS.Checked == true)
                 {
                     dv.RowFilter = "[COUNTRY OF SHIPMENT] = 'XYZ'";
                     LoadSNumber();
                     dataGridView2.DataSource = dv;
                 }
                 if (Chk_Amount != null & Chk_Amount.Checked == true)
                 {
                     dv.RowFilter = "[BILL AMOUNT] < [AMOUNT FINANCED]";
                     LoadSNumber();
                     dataGridView2.DataSource = dv;
                 }
                 if (Chk_Date != null & Chk_Date.Checked == true)
                 {
                     dv.RowFilter = "[Date of Finance] < [InvoiceDate]";
                     LoadSNumber();
                     dataGridView2.DataSource = dv;
                 }
               
             }
        }

        private void Chk_Date_CheckedChanged(object sender, EventArgs e)
        {
           
        }

        private void Chk_Amount_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void Chk_CoS_CheckedChanged(object sender, EventArgs e)
        {
    
        }

        private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            
        }
private void Btn\u Search\u单击(对象发送者,事件参数e)
{
dt=Form1.dataRecord;
数据视图dv=新数据视图(dt);
foreach(数据行dr在dt.行中)
{
if(Chk_CoS!=null&Chk_CoS.Checked==true)
{
dv.RowFilter=“[装运国]='XYZ';
LoadSNumber();
dataGridView2.DataSource=dv;
}
if(Chk_Amount!=null&Chk_Amount.Checked==true)
{
dv.RowFilter=“[票据金额]<[融资金额]”;
LoadSNumber();
dataGridView2.DataSource=dv;
}
if(Chk_Date!=null&Chk_Date.Checked==true)
{
dv.RowFilter=“[融资日期]<[发票日期]”;
LoadSNumber();
dataGridView2.DataSource=dv;
}
}
}
私有void Chk\u Date\u CheckedChanged(对象发送方,事件参数e)
{
}
私有无效Chk\u金额\u检查更改(对象发送方,事件参数e)
{
}
私有void Chk_CoS_CheckedChanged(对象发送方,事件参数e)
{
}
私有void dataGridView2_CellContentClick(对象发送者,DataGridViewCellEventArgs e)
{
}

因此,我们可能有1个或4个复选框。如果它们被选中,那么我们需要那个过滤器

如果不检查,我们不在乎

因此,您要做的是为每个复选框构建一个基于字符串的筛选器,然后应用/创建/使用该筛选器

这样,下面的代码可以用于2个或16个复选框——这无关紧要

为什么有一个for/each用于设置过滤器?你不需要每个过滤器都有一些,你有一些过滤器选项,你设置它们,然后设置一个过滤器。我不为这里的每个数据行考虑a?(非常混乱??)

因此,您有一个datatable,设置一个过滤器,然后应用该过滤器。我看不出每排都需要一个fro。该表的过滤器无论如何都适用于所有行

因此,代码理念、代码方法、代码概念将如下所示:

请非常小心地注意,这段代码在2个或15个复选框中是如何工作的。我们只需构建,在每个选定选项上添加,以构建一个过滤器,其中包含您选中并希望包含的所有选项+过滤器

因此,这应该给你一个想法,一把通往天堂的钥匙,告诉你这是如何工作的:

    dt = MyTable;     - whatever and how your table is - set here.
    string strFilter = "";
    DataView dv = new DataView(dt);

    if (Chk_CoS != null & Chk_CoS.Checked == true)
        strFilter = "([COUNTRY OF SHIPMENT] = 'XYZ' ) ";

    if (Chk_Amount != null & Chk_Amount.Checked == true)
    {
        if (strFitler != "")
            strFilter += " AND ";
        strFilter += "([BILL AMOUNT] < [AMOUNT FINANCED]) ";
    }

    if (Chk_Date != null & Chk_Date.Checked == true)
    {
        if (strFitler != "")
            strFilter += " AND ";

        strFilter += "([Date of Finance] < [InvoiceDate])";
    }

    // Now apply filter

    dv.RowFilter = strFilter;

    DataGridView2.DataSource = dv;
    DataGridView2.DataBind();
}
dt=MyTable;-不管你的桌子是什么样子的,都在这里。
字符串strFilter=“”;
数据视图dv=新数据视图(dt);
if(Chk_CoS!=null&Chk_CoS.Checked==true)
strFilter=“([装运国]=“XYZ”)”;
if(Chk_Amount!=null&Chk_Amount.Checked==true)
{
如果(strfiller!=“”)
strFilter+=“和”;
strFilter+=“([票据金额]<[融资金额]”;
}
if(Chk_Date!=null&Chk_Date.Checked==true)
{
如果(strfiller!=“”)
strFilter+=“和”;
strFilter+=“([财务日期]<[发票日期]”;
}
//现在应用过滤器
dv.RowFilter=strFilter;
DataGridView2.DataSource=dv;
DataGridView2.DataBind();
}
因此,请注意,对于2个或15个过滤器选择,这是如何工作的。我们只是将每个选项的过滤器构建成一个字符串。如果未选中“过滤器”复选框,则不会发生任何情况-我们只会继续构建,并且只为每个复选框选项构建


一旦我们有了过滤器字符串,就需要一个操作来过滤数据表,因此我们将数据视图应用于网格控件。

谢谢@Albert D.Kallal,我必须在这段代码中添加一些内容。您能告诉我如何在gridview中添加标题“备注”的另一列吗?对于每个检索到的记录,“备注”列下都有一个“备注”。但这里有一个陷阱,因为有些记录可以在多个复选框下检索。在这种情况下,应在“备注”下的相应单元格中提及这两个条件。如果记录中有装运国和财务日期<发票日期,则应同时提及两者。此外,我如何检查单元格中的空数据或错误数据。