|
※※※ 注意!! ※※※
Filterを使用した場合、RichTextBox のバインドがこわれるのでご注意下さい。 データも壊れます。 参考までに、それを検証するソースを掲載します。 未熟なソースなので、まちがいだらけかもしれませんが……
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data;
namespace BindingSourceExamples { public class テスト : Form { // ********************************************* // ************* 問題部分 ********************
void 失敗ケース(int x) { IEnumerable<DataRow> aa = from p in dt.AsEnumerable() select p;
foreach (DataRow a in aa) a["旗"] = (a.Field<Int32>("ID") > x) ? true : false;
bs.Filter = "旗=true"; // <-- エラー RichTextのバインドが壊れる }
void 成功ケース(int x) { var aa = from p in dt.AsEnumerable() where p.Field<Int32>("ID") > x select p;
bs.DataSource = aa.AsDataView(); }
void ちょっと成功例(int x) { IEnumerable<DataRow> aa = from p in dt.AsEnumerable() select p;
foreach (DataRow a in aa) a["旗"] = (a.Field<Int32>("ID") > x) ? true : false;
IEnumerable<DataRow> bb = from p in dt.AsEnumerable() where p.Field<bool>("旗") == true select p;
// CopyToDataTableを使用するとデータ保存できない? bs.DataSource = bb.CopyToDataTable<DataRow>(); }
// ********************************************** // **********************************************
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new テスト()); }
RichTextBox rtb = new RichTextBox(); TextBox tb = new TextBox(); Label m1 = new Label(); Label m2 = new Label(); Label m3 = new Label(); Label m4 = new Label(); Button b1 = new Button(); Button b2 = new Button(); Button b3 = new Button(); Button b4 = new Button(); DataGridView dgv = new DataGridView(); BindingSource bs = new BindingSource(); DataTable dt = new DataTable();
public テスト() { this.Size = new Size(350, 400);
// コントロール作成 dgv.Location = new Point(10, 10); dgv.Size = new Size(180,330); this.Controls.Add(dgv);
m1.Location = new Point(200, 20); m1.Size = new Size(120,20); m1.Text = "TextBoxにバインド"; this.Controls.Add(m1);
tb.Location = new Point(200, 40); tb.Size = new Size(120, 30); tb.Name = "AAA"; this.Controls.Add(tb);
m2.Location = new Point(200, 70); m2.Size = new Size(120,20); m2.Text = "RichBoxにバインド"; this.Controls.Add(m2);
rtb.Location = new Point(200, 90); rtb.Size = new Size(120, 30); this.Controls.Add(rtb);
m3.Location = new Point(200, 130); m3.Size = new Size(120,20); m3.Text = "@Aは成功ケース"; this.Controls.Add(m3);
b1.Location = new Point(200, 150); b1.Size = new Size(120, 30); b1.Text = "@ 8以上選択"; b1.Click += new EventHandler(b1_Click); this.Controls.Add(b1);
b2.Location = new Point(200, 180); b2.Size = new Size(120, 30); b2.Text = "A 2以上選択"; b2.Click += new EventHandler(b2_Click); this.Controls.Add(b2);
m4.Location = new Point(200, 220); m4.Size = new Size(120,20); m4.Text = "BCは失敗ケース"; this.Controls.Add(m4);
b3.Location = new Point(200, 240); b3.Size = new Size(120, 30); b3.Text = "@ 8以上選択"; b3.Click += new EventHandler(b3_Click); this.Controls.Add(b3);
b4.Location = new Point(200, 270); b4.Size = new Size(120, 30); b4.Text = "A 2以上選択"; b4.Click += new EventHandler(b4_Click); this.Controls.Add(b4);
// 列作成 DataColumn c1 = new DataColumn(); c1.DataType = System.Type.GetType("System.Int32"); c1.AllowDBNull = false; c1.Caption = "ID"; c1.ColumnName = "ID"; dt.Columns.Add(c1);
DataColumn c2 = new DataColumn(); c2.DataType = System.Type.GetType("System.String"); c2.AllowDBNull = false; c2.Caption = "TEXT"; c2.ColumnName = "TEXT"; dt.Columns.Add(c2);
DataColumn c3 = new DataColumn(); c3.DataType = System.Type.GetType("System.Object"); c3.AllowDBNull = false; c3.Caption = "RTF"; c3.ColumnName = "RTF"; dt.Columns.Add(c3);
DataColumn c4 = new DataColumn(); c4.DataType = System.Type.GetType("System.Boolean"); c4.AllowDBNull = false; c4.Caption = "旗"; c4.ColumnName = "旗"; dt.Columns.Add(c4);
// レコード作成 RichTextBox rt = new RichTextBox(); DataRow r; for (int i = 0; i < 10; i++) { r = dt.NewRow(); r["ID"] = i ; r["TEXT"] = rt.Text = i.ToString(); rt.Text = i.ToString() + i.ToString(); r["RTF"] = rt.Rtf; // 見分けの為重ね文字に r["旗"] = false; dt.Rows.Add(r); }
// バインディングソース作成 bs.DataSource = dt;
// バインディング dgv.DataSource = bs; tb.DataBindings.Add(new Binding("Text", bs, "TEXT", true)); rtb.DataBindings.Add(new Binding("Rtf", bs, "RTF", true));
// 列幅設定 dgv.Columns["ID"].Width = 30; dgv.Columns["TEXT"].Width = 30; dgv.Columns["RTF"].Width = 30; dgv.Columns["旗"].Width = 30; }
void b1_Click(object sender, EventArgs e) { 成功ケース(6); }
void b2_Click(object sender, EventArgs e) { 成功ケース(1); }
void b3_Click(object sender, EventArgs e) { 失敗ケース(6); }
void b4_Click(object sender, EventArgs e) { 失敗ケース(1); } } }
|