C#-如何在重新打开表单后在dataGridView中获取所有行,但是在关闭表单之前应用了过滤器

时间:2018-06-22 09:08:43

标签: c# winforms datagridview datatable ado.net

我正在Windows窗体应用程序上工作。

它包含两种形式的MainForm-Test和childForm-Search

在Testform中,我创建了dataTable“ dt”。搜索表单包含datagridview控件。我为datagridview列应用了两个过滤器-

第一-根据序列号更新SrNo列

2nd-获取介于FROM和TO日期之间的行。

我的主要问题是,当我第一次加载Search表单时,它给了我datatable中存在的所有数据行。但是当我应用filter和close表单然后再次重新打开Search表单时,它给了我过滤后的行,所有行。 请帮我解决这个问题。预先感谢

测试表格代码:

  private void SearchToolStripMenuItem_Click(object sender, EventArgs e)
    {
        SearchTest Search = new SearchTest(dt);
        Search.ShowDialog();
    }

SearchTest类的代码:

 public partial class SearchTest : Form
{
    public SearchTest(DataTable TestData)
    {
        InitializeComponent();
        dataGridView1.DataSource = TestData;
        this.dataGridView1.Sort(this.dataGridView1.Columns["SrNo"], ListSortDirection.Ascending);
    }


    private void btn_Search_Click(object sender, EventArgs e)
    {
        string str = dateTimePicker1.Text;
        string str1 = dateTimePicker2.Text;

        DateTime date = DateTime.ParseExact(str, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
        DateTime date1 = DateTime.ParseExact(str1, "MM/dd/yyyy", CultureInfo.GetCultureInfo("en-GB"));
        string dtFilter = string.Format("[Date] >= '{0} ' AND [Date] <= '{1} '", date.ToString("MM/dd/yyyy"), date1.ToString("MM/dd/yyyy"));
        (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = dtFilter;
    }

    private void tb_SearchSrNo_TextChanged(object sender, EventArgs e)
    {
        try
        {
            (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = String.IsNullOrEmpty(tb_SearchSrNo.Text) ?
                "SrNo IS NOT NULL" :
                String.Format("SrNo LIKE '{0}%' OR SrNo LIKE '{1}%' OR SrNo LIKE '{2}%' OR SrNo LIKE '{3}%'", tb_SearchSrNo.Text, tb_SearchSrNo.Text, tb_SearchSrNo.Text, tb_SearchSrNo.Text);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    private void SearchTest_Load(object sender, EventArgs e)
    {

    }

}

1 个答案:

答案 0 :(得分:1)

DataTable是引用类型,当您将其传递给表单时,对对象所做的更改将是永久性的。

当前,您正在向表单传递DataTable,然后在该实例上应用了过滤器,然后关闭了表单。这意味着过滤器仍在DataTable实例中,因此,下一次将相同的DataTable实例传递给表单时,它将具有过滤器。

要解决此问题,只需将Filter设置为String.Empty或使用BinsingSource作为DataGridView的数据源,并设置Filter的属性BindingSource

例如,将ShowDialog放在dt.DefaultView.RowFilter = "";之后,它将解决此问题。