datagridviewrow.databounditemの操作 - 列挙可能なオブジェクトに変換しますか?
-
30-09-2019 - |
質問
DatagridViewがあります
myGridView.DataSource = GetSomeData()
// method called
public IQueryable GetSomeData()
{
var source = from r in records
select r;
return source; // made correction from 'r' to 'source'
}
GetSomeData()
予想どおりにdatagridviewを埋めます。ユーザーは行を選択して編集し、行データをフォームに渡します。以来 DataGridViewRow.DataBoundItem
匿名タイプです、どうすれば合格できますか DataBoundItem
?
DataBoundItemがiQueryable-間違っていることを半分期待していました。 DataBounditemプロパティのデバッガーからの情報は次のとおりです。
dataBoundItem {customerId = "3133"、last_name = "smith"、first_name = "john"、accountnumber = "js3133"、activeyn = true} <anonymous type>
データが新しいフォームに渡されたら、次のようなことをしたいと思います。
txtFName.Text = SomeEnumeratedObject["First_Name"];
txtLName.Text = SomeEnumeratedObject["Last_Name"];
これを行う方法についてのアイデアはありますか?新しいフォームのコントロールがいくつかの方法に縛られることができれば、それはさらに良いでしょう、IMO SomeEnumeratedObject
.
照会することは可能でしょうか DataBoundItem
linqで?
編集:
変更方法:
public DataView GetSomeData()
{
var source = from r in records
select r;
DataTable table = ToDataTable(myContext, source);
return new DataView(table);
}
完全なソリューションを参照してください ここ.
解決
あなたはそれを渡すことができます dynamic
そして、そのようにプロパティにアクセスします:
public void Test(dynamic item)
{
MessageBox.Show(string.Format("{0} : {1}", item.First_Name, item.Last_Name));
textBox1.DataBindings.Add("Text", _item, "First_Name");
textBox2.DataBindings.Add("Text", _item, "Last_Name");
}
考慮すべきことの1つは、匿名タイプのプロパティが読み取り専用であるため、ユーザーがその方法で値を編集できないことです。 C#言語仕様から:
匿名タイプのメンバーは、型のインスタンスを作成するために使用される匿名オブジェクトの初期イザーから推測される読み取り専用プロパティのシーケンスです。
匿名タイプを使用する代わりに、このタイプを宣言することを検討する必要があります。そうすれば、Intellisenseの利点も得られ、問題なくプロパティの名前を変更/リファクタリングできるようになります。
他のヒント
記録にはどのような種類のオブジェクトがありますか? DatagridViewRow.DataBounditemをどのタイプのオブジェクトレコードが保持しているかにキャストできるはずです。
記録は顧客オブジェクトのリストです。あなたは行くことができるはずです:
txtFName.Text = ((Customer)DataGridViewRow.DataBoundItem).First_Name;
txtLName.Text = ((Customer)DataGridViewRow.DataBoundItem).Last_Name;
それが不可能な場合、私はあなたが反射を使用する必要があると思います:
Type type = DataGridViewRow.DataBoundItem.GetType();
String firstName = (String)type.GetProperty("First_Name")
.GetValue(DataGridViewRow.DataBoundItem, null);
Kevev22とAdriftの両方に正しいアイデアがありました。データを保持するクラスを作成します。 iQueryableの結果をデータテーブルに変換できるため、それを行うのは理にかなっています。
public DataView GetSomeData()
{
var source = from r in records
select r;
DataTable table = ToDataTable(myContext, source);
return new DataView(table);
}
今:
myDGView.DataSource = GetSomeData();
そして、Datagrid行が選択されたら、 DataBoundItem
に DataRow
.
参考までに - iQueryable resultSetをデータテーブルに変換する:
public DataTable ToDataTable(DataContext context, IQueryable source)
{
DataTable table = new DataTable();
{
adapter.SelectCommand = context.GetCommand(source);
sqlCommand.Connection.Open();
adapter.FillSchema(table, SchemaType.Source);
adapter.Fill(table);
}
return table;
}