修复了DataGridView数据绑定

时间:2014-10-18 16:09:14

标签: c# .net datagridview

我正在编写一个计算我的扩展的应用程序。我有一个固定的DatagridView,有12列(1月 - 12月)和5行(类别)。 我的课程:

Month -> contains the value of all 5 categories
Year -> SortedList<MonthSet.AcceptableMonths, Month>
AnnualSpend -> SortedList<ushort, Year>

在开始时,程序将解析XML文件并将数据存储在相关的类中。 现在我有5个属性(每个类别一个)的类'Month',并希望将特定月份绑定到相应的列。 我将能够通过每个单元格并“手动”插入值,但我不知道这是否是一个好方法。此外,我能够在ListBox中绑定所有年份,但我不知道如何绑定数据(当我从ListBox中选择一年时)。我尝试以正常方式执行此操作,但我将丢失所有已定义的行,并将添加新列。 我甚至不知道这是否像我在想的那样有效。如果没有,那么我必须通过每个单元格。

我希望这是可以理解的,有人可以告诉我这是否会起作用。

谢谢;)

1 个答案:

答案 0 :(得分:0)

代码假设AcceptableMonthsEnum定义如下,因此可以从整数转换。

enum AcceptableMonths
{
    JAN, FEB, MAR, ARP, MAY, JUN, JLY, AUG, SEP, OCT, NOV, DEC
}

您可以从DataSet构建AnnualSpend,然后将其中一个表(一年的费用)设置为DataSource的{​​{1}}。从类到DataSet的映射是。

DataGridView

构造DataSet的代码

Month->A Column, Year->A DataTable, AnnualSpend->The entire DataSet

然后从ListBox设置DataGridView的DataSource。

AnnualSpend annualSpend; //already populated 
DataSet dataSet;

private void PopulateDataSet()
{
    dataSet = new DataSet();

    foreach (ushort yr in annualSpend.Keys)
    {
        Year year = annualSpend[yr];
        DataTable tableOfYear = new DataTable(yr.ToString()); //as key to access the Table

        //Adding columns
        List<string> columnNames = new List<string>();
        foreach (DataGridViewColumn column in dataGridView1.Columns)
        {
            columnNames.Add(column.Name);
            column.DataPropertyName = column.Name; //!!!Important!!!
            tableOfYear.Columns.Add(new DataColumn(column.Name));
        }           

        //Adding rows            
        DataRow newRowForFoodExpense = tableOfYear.NewRow();
        //then 4 data rows for other expense categories...
        //DataRow newRowForHouseRent = tableOfYear.NewRow();

        for (int m = 0; m < columnNames.Count; m++)
        {
            newRowForFoodExpense[columnNames[m]] = year[(AcceptableMonths)m].Food;   
            //then 4 data rows for other expense categories...              
        }

        tableOfYear.Rows.Add(newRowForFoodExpense);
        //then 4 data rows for other expense categories... 

        dataSet.Tables.Add(tableOfYear);
    }
}

!!!重要!!!

由于您的DataGridView在DataBinding之前已经定义了12列,因此您需要将listBox1.SelectedIndexChanged += (s, e) => { ushort yr = (ushort)listBox1.SelectedItem; dataGridView1.DataSource = dataSet.Tables[yr.ToString()]; }; 的每一列的DataPropertyName property设置为与DataTable的列名相同,否则绑定将添加新的列。