2

私は 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 } < 匿名型 >

データが新しいフォームに渡されたら、次のようなことをしたいと思います:

txtFName.Text = SomeEnumeratedObject["First_Name"];
txtLName.Text = SomeEnumeratedObject["Last_Name"];

どうすればこれを行うことができるかについてのアイデアはありますか? IMO、新しいフォームのコントロールが何らかの方法で にバインドできれば、さらに良いでしょうSomeEnumeratedObject

DataBoundItemLINQでクエリを実行できますか?

編集:

変更された方法:

public DataView GetSomeData()
{
    var source = from r in records
                 select r;

    DataTable table = ToDataTable(myContext, source);
    return new DataView(table);
}

ここで完全なソリューションを参照してください。

4

3 に答える 3

1

レコード内のオブジェクトのタイプは? DataGridViewRow.DataBoundItem をオブジェクト レコードが保持する型にキャストできる必要があります。

records が Customer オブジェクトのリストであるとします。あなたは行くことができるはずです:

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);
于 2010-11-10T21:17:14.257 に答える
1

として渡し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# 言語仕様から:

匿名型のメンバーは、型のインスタンスを作成するために使用される匿名オブジェクト初期化子から推論される一連の読み取り専用プロパティです。

匿名型を使用する代わりに、これに対して型を宣言することを検討する必要があります。そうすれば、インテリセンスの利点も得られ、問題なくプロパティの名前変更/リファクタリングを行うことができます。

于 2010-11-10T21:44:40.180 に答える
0

kevev22とadriftはどちらも正しい考えを持っていました。それは、データを保持するクラスを作成することです。IQueryableの結果セットをDataTableに変換できるので、それを行うのは理にかなっています。

public DataView GetSomeData()
{
    var source = from r in records
                 select r;

    DataTable table = ToDataTable(myContext, source);
    return new DataView(table);
}

今:

myDGView.DataSource = GetSomeData();

また、データグリッド行を選択すると、をにキャストできDataBoundItemますDataRow

参考までに-IQueryableの結果セットをDataTableに変換するには:

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;
}
于 2010-11-11T00:55:34.743 に答える