मैं सी # विजुअल स्टूडियो 2010 में उपयोगकर्ता नियंत्रण विकसित कर रहा हूं - डेटाग्रिडव्यू को छानने के लिए एक तरह का "त्वरित खोज" टेक्स्टबॉक्स। यह 3 प्रकार के डेटाग्रेडव्यू डेटा स्रोतों के लिए काम करना चाहिए: डेटाटेबल, डेटाबाइंडिंग और डेटासेट। मेरी समस्या डेटासेट ऑब्जेक्ट से डेटाटेबल को फ़िल्टर करने के साथ है, जो डेटाग्रिड व्यू पर प्रदर्शित होती है।
वहाँ 3 मामले हो सकते हैं (उदाहरण के लिए मानक WinForm आवेदन के साथ DataGridView और उस पर TextBox) - पहले 2 ठीक काम कर रहे हैं, मुझे 3 के साथ समस्या है:
1. datagridview.DataSource = dataTable: यह काम करता है
इसलिए मैं सेटिंग द्वारा फ़िल्टर कर सकता हूं: dataTable.DefaultView.RowFilter = "country LIKE '% s%'";
DataTable dt = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Switzerland" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
dataGridView1.DataSource = dt;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " + dataGridView1.DataSource.GetType().ToString());
dt.DefaultView.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " + dataGridView1.DataSource.GetType().ToString());
}
2. datagridview.DataSource = बाइंडिंग स्रोत: यह काम करता है
इसलिए मैं सेटिंग द्वारा फ़िल्टर कर सकता हूं : बाइंडिंग स्रोत .ilter = "देश LIKE '% s%'";
DataTable dt = new DataTable();
BindingSource bs = new BindingSource();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Switzerland" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
bs.DataSource = dt;
dataGridView1.DataSource = bs;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " + dataGridView1.DataSource.GetType().ToString());
bs.Filter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " + dataGridView1.DataSource.GetType().ToString());
}
3. डेटाग्रिडव्यूड.डाटासोर्स = डेटासोर्स; datagridview.DataMember = "TableName":
यह तब काम नहीं करता है जब आप डिज़ाइनर का उपयोग करके किसी टेबल को डिज़ाइन करते हैं: टूलबॉक्स से डेटासेट को फॉर्म पर रखें, डेटाटैब इसमें जोड़ें और फिर डेटाट्रेडव्यूड डेटा सेट करें। डेटा स्रोत; और डाटाग्रिडव्यू। डॅटमम्बर = "टेबलनेम"।
नीचे दिए गए कोड इन कार्यों का दिखावा करते हैं:
DataSet ds = new DataSet();
DataTable dt = new DataTable();
private void Form1_Load(object sender, EventArgs e)
{
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("country", typeof(string));
dt.Rows.Add(new object[] { 1, "Belgium" });
dt.Rows.Add(new object[] { 2, "France" });
dt.Rows.Add(new object[] { 3, "Germany" });
dt.Rows.Add(new object[] { 4, "Spain" });
dt.Rows.Add(new object[] { 5, "Switzerland" });
dt.Rows.Add(new object[] { 6, "United Kingdom" });
ds.Tables.Add(dt);
dataGridView1.DataSource = ds;
dataGridView1.DataMember = dt.TableName;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " + dataGridView1.DataSource.GetType().ToString());
//it is not working
ds.Tables[0].DefaultView.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
MessageBox.Show("DataSource type AFTER = " + dataGridView1.DataSource.GetType().ToString());
}
यदि आप इसका परीक्षण करते हैं - हालाँकि डेटाटेबल को फ़िल्टर किया जाता है (ds.Tables [0] .DefaultView.Count बदलाव), डेटाग्रिड्यूव्यू अपडेट नहीं है ... मैं किसी भी समाधान के लिए लंबे समय से देख रहा हूं, लेकिन समस्या यह है कि डेटास्क्रिप्शन नहीं कर सकता परिवर्तन - जैसा कि यह अतिरिक्त नियंत्रण है, मैं इसे प्रोग्रामर के कोड के साथ गड़बड़ नहीं करना चाहता।
मुझे पता है कि संभावित समाधान हैं:
-
डेटाबाइंड का उपयोग करके डेटाटेबल को बाइंड करना और डेटाबाइंड का उपयोग करना उदाहरण 2 के रूप में: लेकिन यह कोड लिखने के दौरान प्रोग्रामर पर निर्भर है, - डेटास्सोर्स को बाइंडिंग सोर्स में बदलने के लिए, डेटाग्रिड व्यू.डॉटसोर्स = dataSet.Tables [0], या प्रोग्राम को डिफ़ॉल्ट रूप से: हालांकि, यह डेटा स्रोत बदलता है। तो समाधान:
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " + dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
dataGridView1.DataSource = dv;
MessageBox.Show("DataSource type AFTER = " + dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
}
जैसा कि आप MessageBox के डेटा स्रोत पर देख रहे हैं, स्वीकार्य नहीं है ...
मैं ऐसा नहीं करना चाहता, क्योंकि यह संभव है कि एक प्रोग्रामर इसके समान कोड लिखता है:
private void textBox1_TextChanged(object sender, EventArgs e)
{
MessageBox.Show("DataSource type BEFORE = " + dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
DataSet dsTmp = (DataSet)(dataGridView1.DataSource); //<--- it is OK
DataView dv = ds.Tables[0].DefaultView;
dv.RowFilter = string.Format("country LIKE '%{0}%'", textBox1.Text);
dataGridView1.DataSource = dv; //<--- here the source is changeing from DataSet to DataView
MessageBox.Show("DataSource type AFTER = " + dataGridView1.DataSource.GetType().ToString(), ds.Tables[0].DefaultView.Count.ToString());
dsTmp = (DataSet)(dataGridView1.DataSource); //<-- throws an exception: Unable to cast object DataView to DataSet
}
वह ऐसा कर सकता है, जैसे उसने डिज़ाइन में डेटासेट और डेटामेम्बर के साथ डेटाग्रिड्यू डिज़ाइन किया। कोड संकलित किया जाएगा, हालांकि, एक फिल्टर का उपयोग करने के बाद, यह एक अपवाद फेंक देगा ...
तो सवाल यह है: मैं डेटासेट को डेटासेट में कैसे फ़िल्टर कर सकता हूं और डेटास्ग्रेव पर परिणाम को बिना डेटास्रोत को दूसरे में बदले कैसे दिखा सकता हूं? मैं डेटाटेबल को उदाहरण 1 से सीधे फ़िल्टर क्यों कर सकता हूं, जबकि डेटासेट से डेटाटेबल को फ़िल्टर करना काम नहीं कर रहा है? शायद यह DataTable उस मामले में DataGridView के लिए बाध्य नहीं है?
कृपया ध्यान दें, कि मेरी समस्या मुद्दों को डिजाइन करने से है, इसलिए समाधान 3 उदाहरण पर काम करना चाहिए।