1

我有一个List<List<string>>外部列表将是网格的行,而内部列表将是列值。

如何包装List<List<string>>它,使其成为网格的合适数据源,它接受IListor IBindingList

实际上,我希望它被视为具有将字符串公开为用于绑定的公共属性的类List<MyObject>MyObject

我无法更改列表,并且它可以有大量的行,因此复制数据并不理想。

差异的一个简单示例是以下代码,其中包含DataGridViewa WinForm

 public class SupplierEntry
    {
        public string SupplierCode
        {
            get
            {
                return "SUPPLIERCODE";
            }
        }

        public string SupplierTitle
        {
            get
            {
                return "SUPPLIERTITLE";
            }
        }
    }

    private void Test()
    {
        List<string> supplierEntryString = new List<string>();
        supplierEntryString.Add("SUPPLIERCODE");
        supplierEntryString.Add("SUPPLIERTITLE");            

        List<List<string>> supplierListStrings = new List<List<string>>();
        supplierListStrings.Add(supplierEntryString);

        List<SupplierEntry> supplierListObjects = new List<SupplierEntry>();

        SupplierEntry supplierEntryObject = new SupplierEntry();
        supplierListObjects.Add(supplierEntryObject);

        //this can't handle the nested collections, instead showing a Capacity and Count column 
        dataGridView1.DataSource = supplierListStrings;

        //this works giving you a supplier code and title column
        //dataGridView1.DataSource = supplierListObjects;
    }
4

1 回答 1

1

设置 DataGridView 的 DataSource 时,DataGridView 会将提供的对象视为IList<something>,其中每个对象都something将使用反射来查找所有公共可读属性。a 的公共可读属性List<string>是容量和计数。

为了让您的字符串出现在 DataGridView 中,它们必须作为属性呈现。您至少可以通过三种方式做到这一点:创建自己的类(就像您已经使用 所做的那样SupplierEntry)、使用Tuple或使用匿名类型。

允许您在List<List<string>>不复制任何数据的情况下使用源的折衷方案是提供一个包装类,该类仅将数据呈现为属性:

// Provide named properties which really just read elements 
// from the List<string> provided with the constructor
public class ListBasedRecord {
    public string SupplierName { get { return source[0]; } }
    public string SupplierCode { get { return source[1]; } }
    private List<string> source;
    public ListBasedRecord(List<string> source) { this.source = source; }
}

private void ListTest() {
    // ... same as above, you get your List<List<string>> ...
    // Succinctly create a SupplierEntryWrapper for each "record" in the source
    var wrapperList = supplierListStrings
                      .Select(x => new SupplierEntryWrapper(x)).ToList();
    dataGridView1.DataSource = wrapperList;
}
于 2012-11-08T22:21:02.713 回答