【解決方法】データグリッドWPFのセルに到達するにはどうすればよいですか

[ad_1]

こんにちは、私は 2 つのテーブルを結合し、アイテムをデータグリッド ビュー (membersdataGrid) にバインドしました。

C#
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 に到達し、その行を削除します:

C#
RegFee_Tbl bluser = new RegFee_Tbl();
int id = (memebersdataGrid.SelectedItem as RegFee_Tbl).ID;
bluser.Delete(id);

私が試したこと:

C#
RegFee_Tbl bluser = new RegFee_Tbl();
int id = (memebersdataGrid.SelectedItem as ****).ID;
bluser.Delete(id);

**** は私の問題です。ここで st (st はテーブルを結合するためのクエリ名) を使用する必要があることはわかっていますが、st を使用すると、このエラーが発生します > ‘st’ は変数ですが、型のように使用されます

解決策 1

を作成しました 匿名型[^] 投影を表します。 通常、それをオブジェクトにキャストして、リフレクション以外のプロパティを読み取る方法はありません。

シンプルだが壊れやすいアプローチの1つは、 C# dynamic タイプ[^]、リフレクション コードを非表示にします。

C#
dynamic selectedItem = memebersdataGrid.SelectedItem;
int id = selectedItem.ID; // <- Reflection magic happens here...

主な欠点は、インテリセンスがなく、コンパイル時のチェックがないことです。 プロパティ名のスペルが間違っていたり、大文字と小文字が間違っていたりすると、実行時に RuntimeBinderException 投げた。

独自のリフレクションをローリングしても、パフォーマンスが低下する可能性があります。

C#
object selectedItem = memebersdataGrid.SelectedItem;
Type itemType = selectedItem.GetType();
PropertyInfo prop = itemType.GetProperty("ID");
int id = (int)prop.GetValue(selectedItem, null);

より安全な解決策は、射影を表す特定のクラスを作成し、代わりにそれを使用することです。

C#
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]

コメント

タイトルとURLをコピーしました