আমি সি # ভিজ্যুয়াল স্টুডিও 2010-এ ব্যবহারকারীর নিয়ন্ত্রণ বিকাশ করছি - ডেটাগ্রিডভিউ ফিল্টার করার জন্য এক ধরণের "কুইক ফাইন্ড" টেক্সটবক্স। এটি 3 ধরণের ডেটাগ্রিডভিউ ডেটাসোর্সের জন্য কাজ করা উচিত: ডেটা টেবিল, ডেটাবাইন্ডিং এবং ডেটাসেট। আমার সমস্যাটি ডেটাগ্রিডভিউতে প্রদর্শিত ডেটাসেট অবজেক্ট থেকে ডেটা টেবিল ফিল্টার করা নিয়ে।
3 টি কেস থাকতে পারে (এটিতে ডাটাগ্রিডভিউ এবং টেক্সটবক্সের সাথে স্ট্যান্ডার্ড উইনফর্ম অ্যাপ্লিকেশনটির উদাহরণ) - প্রথম 2 টি ঠিক আছে, আমার তৃতীয়টি সমস্যা রয়েছে:
১. ডেটাগ্রিডভিউ।ডাটাসোর্স = ডেটা টেবিল: এটি কাজ করে
তাই আমি সেটিংস দ্বারা ফিল্টার করতে পারি: ডেটাট্যাব.ডাফল্টভিউ।রোফিল্টার = "দেশ লাইক '% 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());
}
২. ডেটাগ্রিডভিউ।ডাটাসোর্স = বাইন্ডিংসোর্স: এটি কাজ করে
যাতে আমি সেটিংস দ্বারা ফিল্টার করতে পারি: বাইন্ডিংসোর্স.ফিল্টার = "দেশ লাইক '% 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());
}
আপনি যদি এটি পরীক্ষা করেন - যদিও ডেটাটেবল ফিল্টার করা হয় (ds.Tables [0]। ডেফল্টভিউ.কাউন্ট পরিবর্তন), ডেটাগ্রিডভিউ আপডেট করা হয় না ... আমি কোনও সমাধানের জন্য দীর্ঘ সময় ধরে খুঁজছি, তবে সমস্যাটি ডেটাসোর্স করতে পারে না পরিবর্তন - এটি অতিরিক্ত নিয়ন্ত্রণ হিসাবে, আমি এটি প্রোগ্রামারের কোডের সাথে গোলমাল করতে চাই না।
আমি জানি সম্ভাব্য সমাধানগুলি
হ'ল : - ডেটাবেন্ডিং ব্যবহার করে ডেটাসেট থেকে ডেটা টেবিল বেঁধে রাখুন এবং উদাহরণ 2 হিসাবে এটি ব্যবহার করুন: তবে কোড লেখার সময় এটি প্রোগ্রামারের উপর
নির্ভর করে - ডাটাসোর্সকে বাইন্ডিংসোর্স, ডেটাগ্রিডভিউ.ডাটাসোর্স = ডেটাসেট.ট্যাবলস [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 থেকে সরাসরি ফিল্টার করতে পারি, যখন ডেটাসেট থেকে ডেটা টেবিল ফিল্টার করা কাজ করছে না? সম্ভবত এটি ডেটাগ্রিডটি সেই ক্ষেত্রে ডেটাগ্রিডভিউয়ের সাথে আবদ্ধ নয়?
দয়া করে মনে রাখবেন, আমার সমস্যাটি ডিজাইনের সমস্যাগুলি থেকে শুরু করে, সুতরাং সমাধানটি উদাহরণস্বরূপ 3 এ কাজ করা উচিত।