【问题标题】:how to map data from a data dictionary to datagridview?如何将数据从数据字典映射到datagridview?
【发布时间】:2012-05-22 23:26:07
【问题描述】:

我有一个数据字典如下:

Key  Value

1    ron k polito
2    Ryan s Winslate    

我正在尝试在 datagridview 中显示 Value 列,其中包含三个不同的列 firstname、midname 和 lastname。以下语句 names.getnames().ToList() 从数据字典中检索名称(值)。

datagridview1.DataSource = names.getnames().ToList();

通过将列表移动到 datagridview 中,创建的行数与数据字典检索到的总数完全相同,但它不显示任何内容。只出现空白行。

我是 C# 新手,有什么建议可以解决这个问题。

谢谢。

代码如下:

             List<localname> lname_list = new List<localname>();
             var l_names = names.getnames().ToList();
             foreach(var lcname in l_names)
             {
                 string[] wrd = lcname.Split(' ');
                 localname lv = new localname();
                 lv.mylocal(wrd[0], wrd[1], wrd[2]);
                 lname_list.Add(lv);
             }
             datagridview1.DataSource = lname_list;
             ShowDialog();

【问题讨论】:

  • asp.net,WinForms,WPF,在什么下?
  • getNames 从数据字典中检索所有值。
  • 似乎我们每周都会看到“空 DataGridView 行”问题。您需要熟悉 DataGridView a 和它的数据源之间的数据绑定是如何工作的。具体来说,如果您手动创建列(而不是在 DGV 上使用 AutoGenerateColumns = true),则必须确保列的 DataPropertyName 与您作为数据源提供的对象类型(或列表中的类型)的公共属性相匹配如果数据源是一个列表)。您没有提供足够的代码来正确评估您的问题。在字典中显示用于 Values 的类型。
  • 阅读本文可能会有所帮助:stackoverflow.com/questions/10692132/…

标签: c# winforms


【解决方案1】:

您将需要一个指定 POCO 的列表,用于填充 DataGrid。 POCO 将包含代表您想要的每一列的属性。示例:

public class Name
{
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; }
}

在您的表单中,您将根据您的 getNames 函数填充列表。

   public Form1()
    {
        InitializeComponent();

        List<Name> namesList = new List<Name>();

        dataGridView1.AutoGenerateColumns = false;
        DataGridViewTextBoxColumn firstNameColumn = new DataGridViewTextBoxColumn();
        makeColumn.DataPropertyName = "First";
        makeColumn.HeaderText = "First Name";

        DataGridViewTextBoxColumn middleNameColumn = new DataGridViewTextBoxColumn();
        modelColumn.DataPropertyName = "Middle";
        modelColumn.HeaderText = "Middle Name";

        DataGridViewTextBoxColumn lastNameColumn = new DataGridViewTextBoxColumn();
        yearColumn.DataPropertyName = "Last";
        yearColumn.HeaderText = "Last Name";

        dataGridView1.Columns.Add(firstNameColumn);
        dataGridView1.Columns.Add(middleNameColumn);
        dataGridView1.Columns.Add(lastNameColumn);

        for (int i = 0; i < names.getNames().Length; i++)
        {
            // TODO create new Name object. 
            // TODO set properties in new Name object accordingly.
            // TODO add name object to namesList once properties have been set.
        }

        dataGridView1.DataSource = namesList;
    }

你也可以使用 ObservableCollection 或 BindingList 来代替 List

【讨论】:

  • 我按照上面提到的方法尝试过,但仍然没有运气......我在 datagridview 中得到 2 个空行。但没有数据。
  • @Csharp_learner 确保在网格中指定了正确的“要使用的字段”。它使用数据源中对象的反射和动态绑定。
  • @Csharp_learner 听起来数据显示不正确。如果您有两个空行,则数据“存在”,但绑定不正确。试试更新的代码。
  • 谢谢大家......它工作......问题是未设置数据网格属性名。再次感谢!!!!!!!!!!!!
【解决方案2】:

使用 LINQ,您只需几行代码即可完成此操作。

如果你有一个像这样的自定义类

class CustomerName
{
   public string FirstName { get; set;}
   public string MidName { get; set; }
   public string LastName { get; set; }
}

你的字典值是第一个。中间名,姓氏(意味着该值应始终包含 3 个部分);你可以这样做。

Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "ron k polito");
dic.Add(2, "Ryan s Winslate");

var dicNames = (from a in (dic.Select(b => b.Value).Select(c => c.Split(' ')).AsEnumerable()) select new CustomerName { FirstName = a[0], MidName = a[1], LastName = a[2] }).ToList();            

dataGridView1.DataSource = dicNames;

输出

【讨论】:

  • 我不确定....但我仍然没有得到任何数据。是因为我使用的是 showdialog() ???
  • 为什么需要 ShowDialog()? ShowDialog 在那里以对话框的形式打开另一个表单。例如,您在 Form1 中有一个按钮,当您单击时,如果您想将 Form2 作为对话框打开,在 Form1_Click 事件中您将调用 Form2instance.ShowDialog();
  • 能不能把代码放到Form_Load事件下看看能不能用。
  • 谢谢大家......它工作......问题是未设置数据网格属性名。再次感谢!!!!!!!!!!!!
【解决方案3】:

它很简单,您不需要任何额外的编码。 就这样做

Grd.DataSource=null;

Grd.DataSource = DictionaryObject.Values.ToList();

就是这样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2020-07-14
    • 1970-01-01
    • 2018-08-13
    • 2015-10-17
    相关资源
    最近更新 更多