我正在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)
{
}
}
答案 0 :(得分:1)
DataTable
是引用类型,当您将其传递给表单时,对对象所做的更改将是永久性的。
当前,您正在向表单传递DataTable
,然后在该实例上应用了过滤器,然后关闭了表单。这意味着过滤器仍在DataTable
实例中,因此,下一次将相同的DataTable
实例传递给表单时,它将具有过滤器。
要解决此问题,只需将Filter
设置为String.Empty
或使用BinsingSource
作为DataGridView
的数据源,并设置Filter
的属性BindingSource
。
例如,将ShowDialog
放在dt.DefaultView.RowFilter = "";
之后,它将解决此问题。