如何将List <string>绑定到DataGridView控件?

我有一个简单的方法List<string>,希望将其显示在DataGridView列中。

如果列表包含更复杂的对象,只需将列表建立为其DataSource属性的值即可。


但是当这样做时:


myDataGridView.DataSource = myStringList;

我看到一列,Length然后显示字符串的长度。


如何在列中显示列表中的实际字符串值?


弑天下
浏览 863回答 3
3回答

波斯汪

你也可以使用LINQ和匿名类型描述用少得多的代码实现同样的结果在这里。更新:博客已关闭,这里是内容:(..)表中显示的值表示字符串的长度,而不是字符串值(!)似乎很奇怪,但这是绑定机制的默认工作方式-给定对象,它将尝试绑定到该对象的第一个属性对象(它可以找到的第一个属性)。当传递实例String类时,它绑定到的属性是String.Length,因为没有其他属性可以提供实际的字符串本身。这意味着要获得正确的绑定,我们需要一个包装器对象,该对象将字符串的实际值作为属性公开:public class StringWrapper&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;string stringValue;&nbsp; &nbsp; &nbsp;public string StringValue { get { return stringValue; } set { stringValue = value; } }&nbsp; &nbsp; &nbsp;public StringWrapper(string s)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp;StringValue = s;&nbsp; &nbsp; &nbsp;}&nbsp; }&nbsp; &nbsp;&nbsp; &nbsp;List<StringWrapper> testData = new List<StringWrapper>();&nbsp; &nbsp;// add data to the list / convert list of strings to list of string wrappers&nbsp; Table1.SetDataBinding(testdata);尽管此解决方案可以按预期工作,但它需要很多行代码(主要是将字符串列表转换为字符串包装器列表)。我们可以使用LINQ和匿名类型来改进此解决方案-我们将使用LINQ查询来创建字符串包装器的新列表(在我们的例子中,字符串包装器将是匿名类型)。&nbsp;var values = from data in testData select new { Value = data };&nbsp;Table1.SetDataBinding(values.ToList());我们要做的最后更改是将LINQ代码移至扩展方法:public static class StringExtensions&nbsp; {&nbsp; &nbsp; &nbsp;public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp;var values = from data in strings&nbsp; &nbsp; &nbsp;select new { Value = data };&nbsp; &nbsp; &nbsp;return values.ToList();&nbsp; &nbsp; &nbsp;}这样,我们可以通过对任何字符串集合调用单个方法来重用代码:Table1.SetDataBinding(testData.CreateStringWrapperForBinding());
打开App,查看更多内容
随时随地看视频慕课网APP