c# - डाटासोर्स को बदले बिना डेटाग्रिड व्यू फ़िल्टर करना




winforms visual-studio-2010 (5)

// "टिप्पणी" डेटासेट बदलने के बिना फ़िल्टर डेटाग्रिड, पूरी तरह से काम करता है।

            (dg.ItemsSource as ListCollectionView).Filter = (d) =>
            {
                DataRow myRow = ((System.Data.DataRowView)(d)).Row;
                if (myRow["FName"].ToString().ToUpper().Contains(searchText.ToString().ToUpper()) || myRow["LName"].ToString().ToUpper().Contains(searchText.ToString().ToUpper()))
                    return true; //if want to show in grid
                return false;    //if don't want to show in grid
            };         

मैं सी # विजुअल स्टूडियो 2010 में उपयोगकर्ता नियंत्रण विकसित कर रहा हूं - डेटाग्रिडव्यू फ़िल्टर करने के लिए "त्वरित खोज" टेक्स्टबॉक्स का एक प्रकार। इसे 3 प्रकार के डेटाग्रिडव्यू डेटा स्रोतों के लिए काम करना चाहिए: डेटाटेबल, डाटा बाइंडिंग और डेटासेट। मेरी समस्या डेटासेट ऑब्जेक्ट से डेटाटेबल को फ़िल्टर करने के साथ है, जो DataGridView पर प्रदर्शित होती है।

3 मामले हो सकते हैं (मानक WinForm एप्लिकेशन के लिए उदाहरण डेटाग्रिड व्यू और टेक्स्टबॉक्स के साथ उदाहरण) - पहले 2 ठीक काम कर रहे हैं, मुझे तीसरी समस्या है:

1. डेटाग्रिडव्यू। डेटासोर्स = डेटाटेबल: यह काम करता है
इसलिए मैं सेटिंग द्वारा फ़िल्टर कर सकता हूं: dataTable.DefaultView.RowFilter = "देश 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 = बाध्यकारी स्रोत: यह काम करता है
इसलिए मैं सेटिंग द्वारा फ़िल्टर कर सकता हूं: bindingSource.Filter = "देश 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. डेटाग्रिडव्यू। डेटासोर्स = डेटा स्रोत; डेटाग्रिडव्यू। डेटामैम्बर = "टेबलनाम": यह काम नहीं करता है
यह तब होता है जब आप डिज़ाइनर का उपयोग करके एक टेबल डिज़ाइन करते हैं: डेटासेट को टूलबॉक्स से फॉर्म पर रखें, डेटा जोड़ें और इसके बाद डेटाग्रिडव्यू सेट करें। डेटासोर्स = डेटा स्रोत; और डेटाग्रिडव्यू। डेटामैम्बर = "टेबलनाम"।
नीचे दिए गए कोड इन परिचालनों का नाटक करते हैं:

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());
}

यदि आप इसका परीक्षण करते हैं - हालांकि डेटाटेबल फ़िल्टर किया गया है (डीएसटेबल्स [0]। डीफॉल्ट व्यू। काउंटर चेंज), डेटाग्रिडव्यू अपडेट नहीं किया गया है ... मैं किसी भी समाधान के लिए काफी समय से तलाश कर रहा हूं, लेकिन समस्या यह है कि डेटासोर्स नहीं कर सकता बदलें - क्योंकि यह अतिरिक्त नियंत्रण है, मैं नहीं चाहता कि यह प्रोग्रामर के कोड से गड़बड़ हो।

मुझे पता है कि संभावित समाधान हैं:
- डाटाबेसिंग का उपयोग करके डेटासेट से डेटाटेबल को बाध्य करने और इसे उदाहरण 2 के रूप में उपयोग करने के लिए: लेकिन यह कोड लेखन के दौरान प्रोग्रामर पर निर्भर है,
- डेटा स्रोत को बाध्यकारी स्रोत में बदलने के लिए, डेटा GridView.DataSource = 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());
}

स्वीकार्य नहीं है, जैसा कि आप संदेशबॉक्स के डेटा पर देखते हैं स्रोत बदल रहा है ...

मैं ऐसा नहीं करना चाहता, क्योंकि यह संभव है कि प्रोग्रामर इस तरह के कोड लिखता है:

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 को सीधे डेटा 1 से फ़िल्टर क्यों कर सकता हूं? हो सकता है कि डेटाटाइड उस मामले में DataGridView से बाध्य न हो?

कृपया ध्यान दें, कि मेरी समस्या मुद्दों को डिजाइन करने से होती है, इसलिए समाधान को उदाहरण 3 पर काम करना चाहिए।


आप अपने डेटा स्रोत से DataView ऑब्जेक्ट बना सकते हैं। यह आपको डेटा स्रोत को सीधे संशोधित किए बिना अपने डेटा को फ़िल्टर और सॉर्ट करने की अनुमति देगा।

साथ ही, dataGridView1.DataBind(); को कॉल करना याद रखें dataGridView1.DataBind(); डेटा स्रोत सेट करने के बाद।


मुझे उस समस्या को ठीक करने का एक आसान तरीका मिला। बाध्यकारी datagridview.DataSource = dataSetName.Tables["TableName"]; आपने अभी किया है: datagridview.DataSource = dataSetName.Tables["TableName"];

यदि आप इस तरह कोड करते हैं:

datagridview.DataSource = dataSetName;
datagridview.DataMember = "TableName";

फ़िल्टरिंग करते समय डेटाग्रिडव्यू डेटा को फिर से लोड नहीं करेगा।


मेरे पास DataGridView में स्वचालित खोज पर एक स्पष्ट प्रस्ताव है

यह एक उदाहरण है

private void searchTb_TextChanged(object sender, EventArgs e)
    {
        try
        {
            (lecteurdgview.DataSource as DataTable).DefaultView.RowFilter = String.IsNullOrEmpty(searchTb.Text) ?
                "lename IS NOT NULL" :
                String.Format("lename LIKE '{0}' OR lecni LIKE '{1}' OR ledatenais LIKE '{2}' OR lelieu LIKE '{3}'", searchTb.Text, searchTb.Text, searchTb.Text, searchTb.Text);
        }
        catch (Exception ex) {
            MessageBox.Show(ex.StackTrace);
        }
    }

मैंने बस एक ही समस्या पर एक घंटा बिताया। मेरे लिए जवाब शर्मनाक रूप से सरल साबित हुआ।

(dataGridViewFields.DataSource as DataTable).DefaultView.RowFilter = string.Format("Field = '{0}'", textBoxFilter.Text);






filter