[ad_1]
こんにちは、私は 2 つのテーブルを結合し、アイテムをデータグリッド ビュー (membersdataGrid) にバインドしました。
private void Load() { var st = (from s in db.RegFee_Tbl join o in db.User_Tbl on s.NumberPhone equals o.NumberPhone select new { s.ID, s.RegTime, s.NumberPhone, o.FatherName, o.Name}).ToList(); membersdataGrid.ItemsSource = st; datagrid = membersdataGrid; }
上記の方法を使用して、結合されたテーブルをデータグリッド(membersdataGrid)にバインドします。データグリッドには、選択した行を削除するボタンがあり、buttuon クリックイベントで、このコードを使用して選択した行 ID に到達し、その行を削除します:
RegFee_Tbl bluser = new RegFee_Tbl(); int id = (memebersdataGrid.SelectedItem as RegFee_Tbl).ID; bluser.Delete(id);
私が試したこと:
RegFee_Tbl bluser = new RegFee_Tbl(); int id = (memebersdataGrid.SelectedItem as ****).ID; bluser.Delete(id);
**** は私の問題です。ここで st (st はテーブルを結合するためのクエリ名) を使用する必要があることはわかっていますが、st を使用すると、このエラーが発生します > ‘st’ は変数ですが、型のように使用されます
解決策 1
を作成しました 匿名型[^] 投影を表します。 通常、それをオブジェクトにキャストして、リフレクション以外のプロパティを読み取る方法はありません。
シンプルだが壊れやすいアプローチの1つは、 C# dynamic
タイプ[^]、リフレクション コードを非表示にします。
dynamic selectedItem = memebersdataGrid.SelectedItem; int id = selectedItem.ID; // <- Reflection magic happens here...
主な欠点は、インテリセンスがなく、コンパイル時のチェックがないことです。 プロパティ名のスペルが間違っていたり、大文字と小文字が間違っていたりすると、実行時に RuntimeBinderException
投げた。
独自のリフレクションをローリングしても、パフォーマンスが低下する可能性があります。
object selectedItem = memebersdataGrid.SelectedItem; Type itemType = selectedItem.GetType(); PropertyInfo prop = itemType.GetProperty("ID"); int id = (int)prop.GetValue(selectedItem, null);
より安全な解決策は、射影を表す特定のクラスを作成し、代わりにそれを使用することです。
public class MemberProjection { public int ID { get; set; } public DateTime? RegTime { get; set; } public string NumberPhone { get; set; } public string FatherName { get; set; } public string Name { get; set; } } ... private void Load() { var st = (from s in db.RegFee_Tbl join o in db.User_Tbl on s.NumberPhone equals o.NumberPhone select new MemberProjection { ID = s.ID, RegTime = s.RegTime, NumberPhone = s.NumberPhone, FatherName = o.FatherName, Name = o.Name }).ToList(); membersdataGrid.ItemsSource = st; datagrid = membersdataGrid; } ... int id = ((MemberProjection)memebersdataGrid.SelectedItem).ID;
注意: これらのアプローチのいずれにおいても、 SelectedItem
多分 null
. そのプロパティの 1 つにアクセスする前に、それを確認する必要があります。
[ad_2]
コメント