【问题标题】:how to bind datasource to List<Dictionary<string, string>>?如何将数据源绑定到 List<Dictionary<string, string>>?
【发布时间】:2009-08-17 08:40:56
【问题描述】:

我有一个存储字典条目列表的类。我想将其绑定到来自代码隐藏的 gridview 的数据源。

字典类型的代码,代表ErrorMessage和失败的字段。

public partial class FailedFields
{
    private Dictionary<string, string> Code_Error = new Dictionary<string, string>();
    public void AddFailedField(string field, string message)
    {
        Code_Error.Add(field, message);
    }
    public Dictionary<string, string> GetFailedFields()
    {
        return Code_Error;
    }
}

字典条目列表的代码。

public partial class ErrorFieldsList
{
    private static List<Order.FailedFields> ErrorList = new List<Slab.FailedFields>();
    public void AddErrorField(Order.FailedFields errs)
    {
        ErrorList.Add(errs);
    }
    public List<Order.FailedFields> GetErrorMessages()
    {
        return ErrorList;
    }
}

在 Visual Studio 调试模式下运行,我可以看到列表中有错误列表,但我无法让它显示在 gridview 中。 Bellow 是我尝试将列表设置为数据源的众多方式之一(最有意义的方式)。

ErrorBoxGridView.DataSource = FailedRecords.GetErrorMessages(). ;
ErrorBoxGridView.DataBind();

知道我哪里出错了吗? 另外,我不想在 aspx 页面中指定数据源,因为我只想在发生错误时显示它。

如果对我为什么要这样做来存储错误消息感兴趣,请查看:link 1

已解决 Related Question 完成 wiki 后,我将记录一个完整的项目。

【问题讨论】:

  • 自动数据绑定无法做到这一点。您必须使用 PropertyDescriptor,以便表格知道如何将项目转换为表格。在 MSDN 中查找 BindingList、PropertyDescriptor 和 ITypedList。
  • 还可以考虑使用 StringDictionary (msdn.microsoft.com/en-us/library/…) 代替 Dictionary。

标签: c# list dictionary datasource


【解决方案1】:

我认为这是做不到的。我要做的是:

  1. 不要使用Dictionary&lt;string, string&gt;,而是定义一个包含字段和消息的两个公共属性的类
  2. 为该类创建对象数据源(使用 Visual Studios“数据源”窗口)
  3. 让GetErrorMessages() 返回List&lt;ErrorClass&gt; 而不是Dictionary
  4. 将该列表分配给绑定源。

编辑
这是为了根据最新的cmets来澄清事情。您需要的是包含 one 错误信息的 one 类。例如:

public class ErrorInfo
{
   public string Field { get { ... } }
   public string Message { get { ... } }
}

之后,您在表单上放置BindingSource 并(在代码中)将其DataSource 属性设置为错误消息类的列表。例如:

private List<ErrorInfo> errorList = new List<ErrorInfo>();
errorList.Add(new ErrorInfo() { ... });
errorList.Add(new ErrorInfo() { ... });
errorList.Add(new ErrorInfo() { ... });

bindingSource.DataSource = errorList;

数据网格视图绑定到BindingSource。您现在应该看到数据。您也可以手动创建列并将它们设置为 ErrorInfo 类的相应属性名称,但是您必须在代码中的某处将 dataGridView.AutoCreateColumns 设置为 false。

【讨论】:

  • 是的,使用简单的包装器比使用属性描述符更简单...
  • Thorsten,感谢您的回答,但根据您的描述,这不起作用。我需要存储多对(FieldName,ErrorMessage)。因此 ErrorClass 必须包含 (FieldName,ErrorMessage) 对的列表。但是您给了我一个废弃字典的想法,并使用 List 其中 ErrorClass 表示 (FieldName,ErrorMessage) 对的列表。因此,我将得到一个列表。我会试试这个,看看它会导致什么。
  • 您最终将不得不将 List> 展平为 List<...>,因为数据绑定需要显示的项目和“数据行”(在您的情况下,这将是一个字段的错误消息)。
  • 谢谢,我现在明白那部分了。我现在将列表作为类的实例传递。所以我有一个列表对象,每个对象都是一个包含错误列表的类......但我仍然无法让它显示在网格中!
【解决方案2】:

Databind List of Dictionnary into a GridView

List<Dictionary<string,string>> resultSet = SOME List of Dictionaries...
DataGridView.DataSource = resultSet.Select(x => new { 
fieldOne = x["key1"], fieldTwo = x["key2"] 
}).ToList();
DataGridView.DataBind();

现在您可以在 DataGridView 元素中绑定 fieldOne 和 fieldTwo...

请检查链接以获得准确的答案...

谢谢

【讨论】:

    【解决方案3】:

    .NET 提供了一个方便的 KeyValuePair)>) 结构,可以在这种情况下使用。这样您就不必定义自己的类。 HTH。

    【讨论】:

      【解决方案4】:

      或者您可以绑定到每个 Dictionary 项目的 Value & Key 属性:

      ErrorBoxGridView.DataSource = FailedRecords.GetErrorMessages();
      ErrorBoxGridView.DataTextField = "Value";
      ErrorBoxGridView.DataValueField = "Key";
      ErrorBoxGridView.DataBind();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2018-01-30
        相关资源
        最近更新 更多