在DataTable中对单元格进行分组

时间:2013-05-15 08:46:24

标签: c# datatable cell

我有一个DataTable,在所有单元格中保存十进制值。 在该表中,我需要在每个组的单元格中有3个具有相同值的值组,这些单元格分布在表格中。

使用3个NumUpDown控件,我希望控制表格中每个组单元格中的值。

我可以轻松访问和控制表格中每个单元格的值(MyTable.Rows[rowIndex][colIndex] = numUpDown.Value),但我没有找到任何方法来定义组并将它们彼此区分开来。

ASAIK,表格单元格没有可用于区分它们的属性。 一个选项可能是构建另一个相同的索引表来保存分组信息,但我正在寻找更直接的东西。

(可能有一种解决方法使用组中的实际初始相同值,但这远非安全)。 任何想法将受到高度赞赏! 谢谢

1 个答案:

答案 0 :(得分:0)

正如我所说,我通过在表格中添加额外的列来解决这个问题。 对于每个单元,添加具有颜色(或其他)信息的单元。 当数据网格打开时,它会读取添加的单元格,并通过额外单元格中的信息决定基本单元格颜色。 这是我设计的测试程序的完整工作代码: (要运行,使用DataGridView'fareGrid'和3个NumUpDown控件构建WinForm) (我仍然有颜色不起作用的问题(请参阅代码中的注释),但我会将其作为单独的问题发布)。 这是计算每个使用时间(星期几,小时,季节)的可变电能成本的计划的一小部分

using System;
using System.Data;
using System.Drawing;
using System.Web.UI.WebControls;
using System.Windows.Forms;

//This is a test program to do the following:
//1. Build an empty data table of 26 rows by 6 columns.
//2. The Table is the DataSource to a DataGridView.
//3. The DataGrid Colomns 0-3 can be filled with decimals by one of 3 NumericUpDown      controls.
//3. For each cell in cols 0-2 there is one in cols 3-5 that holds info which NumUpDn  was used.
//4. Each NumUpDn has specific color. The corresponding cells have the same backcolor.
//5. When the program starts, it builds the table from the Settings, and displays the  table in the datagrid.
//6. The cells in cols 0-2 are supposed to get the colors ad indicated in cols 3-5, but they do not.  


namespace DataGridViewTest
{
public partial class Form1 : Form
{
    DataTable fareTable = new DataTable();

    int rowIndex;
    int colIndex;

    public Form1()
    {
        InitializeComponent();
        buildFareTable("fareTable");
        // Load the table (if exists)
        if (Properties.Settings.Default.fareTable != null)
            fareTable = Properties.Settings.Default.fareTable;
        paintFareTableCells(fareTable);

    }

    //Build the initial data table of 26R X 6C
    //Columns 3-5 are used to hold the color information of cols 0-2
    public void buildFareTable(string fareTableName)
    {
        fareTable.TableName = fareTableName;
        fareTable.Columns.Add("Weekday", typeof(Decimal));
        fareTable.Columns.Add("HalfDay", typeof(Decimal));
        fareTable.Columns.Add("Weekend", typeof(Decimal));

        //Adding 3 indexing columns that will hold the tables cell group
        fareTable.Columns.Add("IWeekday", typeof(String));
        fareTable.Columns.Add("IHalfDay", typeof(String));
        fareTable.Columns.Add("Iweekend", typeof(String));

        for (rowIndex = 0; rowIndex < 26; rowIndex++)
        {
            fareTable.Rows.Add();
        }
    }

    public void paintFareTableCells(DataTable fareTable)
    {
        fareDataGrid.DataSource = fareTable;

        for (rowIndex = 0; rowIndex < 26; rowIndex++)
        {
            for (colIndex = 0; colIndex < 3; colIndex++)
            {
                switch (fareTable.Rows[rowIndex][colIndex + 3].ToString())   //Check the color index columns 3-5
                {
                    case "low": fareDataGrid[colIndex, rowIndex].Style.BackColor = Color.Green;  
                        break;
                    case "med": fareDataGrid[colIndex, rowIndex].Style.BackColor = Color.Yellow; 
                        break;
                    case "high": fareDataGrid[colIndex, rowIndex].Style.BackColor = Color.Red;  
                        break;
                    default:
                        break;
                }

                // Diagnostics: Check cell's color. At this point, Colors are OK!  
                Color color = fareDataGrid[colIndex, rowIndex].Style.BackColor;  
            }
        }
    }

   //Update the cells by 3 NumUpDn controls.
    private void numericUpDownFareHigh_ValueChanged(object sender, EventArgs e)
    {
        editFareTableCells(sender);
    }
    private void numericUpDownFareMed_ValueChanged(object sender, EventArgs e)
    {
        editFareTableCells(sender);
    }

    private void numericUpDownFareLow_ValueChanged(object sender, EventArgs e)
    {
        editFareTableCells(sender);
    }

    public void editFareTableCells(Object sender)
    {
        foreach (DataGridViewCell cell in fareDataGrid.SelectedCells)
        {
            if (cell.ColumnIndex < 3)
            {
                cell.Value = ((NumericUpDown)sender).Value;
                cell.Style.BackColor = ((NumericUpDown)sender).BackColor;
                fareDataGrid[cell.ColumnIndex + 3, cell.RowIndex].Value = ((NumericUpDown)sender).Tag;   //Uses cols 3-5 to hold cost level info.
            }
        }
    }

    //Use settings to preserve the data
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.fareTable = this.fareTable;
        Properties.Settings.Default.Save();
    }
  }
}