为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
弑天下 2019-10-18 10:41:23
我有一个简单的方法List<string>,希望将其显示在DataGridView列中。如果列表包含更复杂的对象,只需将列表建立为其DataSource属性的值即可。但是当这样做时:myDataGridView.DataSource = myStringList;我看到一列,Length然后显示字符串的长度。如何在列中显示列表中的实际字符串值?
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

你也可以使用LINQ和匿名类型描述用少得多的代码实现同样的结果在这里。


更新:博客已关闭,这里是内容:


(..)表中显示的值表示字符串的长度,而不是字符串值(!)似乎很奇怪,但这是绑定机制的默认工作方式-给定对象,它将尝试绑定到该对象的第一个属性对象(它可以找到的第一个属性)。当传递实例String类时,它绑定到的属性是String.Length,因为没有其他属性可以提供实际的字符串本身。


这意味着要获得正确的绑定,我们需要一个包装器对象,该对象将字符串的实际值作为属性公开:


public class StringWrapper

    {

     string stringValue;

     public string StringValue { get { return stringValue; } set { stringValue = value; } }


     public StringWrapper(string s)

     {

     StringValue = s;

     }

  }   


   List<StringWrapper> testData = new List<StringWrapper>();


   // add data to the list / convert list of strings to list of string wrappers


  Table1.SetDataBinding(testdata);

尽管此解决方案可以按预期工作,但它需要很多行代码(主要是将字符串列表转换为字符串包装器列表)。


我们可以使用LINQ和匿名类型来改进此解决方案-我们将使用LINQ查询来创建字符串包装器的新列表(在我们的例子中,字符串包装器将是匿名类型)。


 var values = from data in testData select new { Value = data };


 Table1.SetDataBinding(values.ToList());

我们要做的最后更改是将LINQ代码移至扩展方法:


public static class StringExtensions

  {

     public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)

     {

     var values = from data in strings

     select new { Value = data };


     return values.ToList();

     }

这样,我们可以通过对任何字符串集合调用单个方法来重用代码:


Table1.SetDataBinding(testData.CreateStringWrapperForBinding());


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 862 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信