5

datagridviewのデータソースをリストに変換するジェネリック関数を作成しようとしています(次に、空のオブジェクトをリストに追加します。データソースはどのタイプでもかまいません)。

私のいくつかの必死の試みは次のように見えました:

Type datagrid_type = dgv.DataSource.GetType();
List<object> the_source = dgv.DataSource as List<object>;
Convert.ChangeType(the_source, datagrid_type);
Object c = Activator.CreateInstance(datagrid_type);
Convert.ChangeType(c, datagrid_type);
the_source.Add(c);

..しかしthe_source、ただnullです。そうでない場合でも、おそらく機能しません。皆さんはこれを達成するためのより賢い方法(実際に機能する方法..)を持っていると確信しています。

ps EFを使用してデータソースであるリストを作成しているので、データソースをDataTableにキャストすることはおそらくここでは関係ありません

4

3 に答える 3

3

私は次のようにしました(バインディングデータソースを使用する場合にのみ機能します)

カスタム datagridview コントロールを作成し、datagridview を継承する

public partial class MyGridView : DataGridView

columnname、summaryvalue、および表示する形式を保持するクラスを宣言します

    [Serializable]
    public class SummaryDataProperty
    { 
        public string ColumnName { get; set; }
        public string Format { get; set; }
        internal decimal Value { get; set; }
    }

MyDataGridView で集計データ プロパティのリストを宣言する

    public List<SummaryDataProperty> SummaryDataPropertyNames { get; set; }

データ バインディングが完了したら、集計を計算し、列ヘッダーに表示します。

  protected override void OnDataBindingComplete(DataGridViewBindingCompleteEventArgs e)
    {
        base.OnDataBindingComplete(e);
        if (SummaryDataPropertyNames.Count > 0)
        {
            if (DataSource is BindingSource)
            {
                var ds = (DataSource as BindingSource);
                foreach (var prop in SummaryDataPropertyNames)
                {
                    prop.Value = 0;
                    var col = this.Columns[prop.ColumnName];
                    foreach (var l in ds.List)
                    {
                        decimal val;
                        if (decimal.TryParse(Convert.ToString(l.GetType().GetProperty(col.DataPropertyName).GetValue(l, null)), out val))
                            prop.Value +=   val;
                    }
                    col.HeaderText = col.HeaderText.Split('[')[0].TrimEnd(' ') + " [" + prop.Value.ToString(prop.Format) + "]";
                }

            }
        }
    }

バインディング データ ソースは、データ ソースからのオブジェクトのリストを提供するためです。バインディング ソース リストをループするのは簡単です。オブジェクト datasource または BindingDatasource.Current でこれを行う方法がわかりません。私はまだ解決策を探しています。

于 2013-01-15T15:45:52.027 に答える
1

一般的な関数/メソッドが必要で、さまざまなオブジェクトのリストを渡す場合は、これを行うことができます (私のアプリで抽出された例):

public void SaveAll<T>(IEnumerable<T> objects)
{
    foreach (object obj in objects)
    {
        T specificObject = (T)obj;
        Session.Save(specificObject);
    }
    Session.Flush();
}

したがって、このメソッドは任意のクラス オブジェクトで呼び出すことができます。

List<Product> products = Product.GetAll();
SaveAll<Product>(products);

List<Vendor> vendors = Vendor.GetAll();
SaveAll<Vendor>(vendors);

etc

一方、 a がDataGridViewあり、行を追加したい場合は、 a BindingSourceasを使用できますDataGridView's DataSource。例:

...
private BindingSource Source;
...

private void LoadProducts(List<Product> products)
{
       Source.DataSource = products;
       ProductsDataGrid.DataSource = Source;
}

private void addProductBtn_Click(object sender, EventArgs e)
{
       Source.Add(new Product());
}
于 2013-01-15T22:36:39.410 に答える