2

我有一个测试程序,它构建一个数据表(26 行 x 6 列)作为 DataGridView 的数据源。
可以通过选择单元格并从 3 个 NumUpDown 控件之一输入值来编辑数据网格。
每个控件都有特定的颜色。为了保留信息,我将表格保存在用户设置中。
我将每个单元格的颜色信息保存在额外的表格单元格中。
问题:当我显示数据网格时,它从表中读取了正确的值,但是应该根据额外的单元格信息以编程方式添加的单元格颜色不显示。
(我可以在诊断中看到单元格获得正确的颜色,但它没有显示在数据网格中。
看起来数据网格有一些颜色覆盖(?)。
附件是完整的工作代码。
在代码中查看更多信息。
任何人都可以运行它并找出为什么颜色没有显示在数据网格中吗?谢谢。

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 bind (as 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.
//To run, make a WinForm with a datagrid 'fareGrid' and 3 NumUpDn controls with background colors.  


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();
    }
}
}
4

3 回答 3

2

变色代码必须在事件处理程序中;具体来说,DataBindingComplete事件处理程序。我重写了你的代码如下:

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

void fareDataGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    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;
        }
    }
}

现在,单元格会根据需要根据值更改颜色。

顺便说一句,不要忘记在构造函数中订阅事件处理程序:

fareDataGrid.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(fareDataGrid_DataBindingComplete);
于 2013-08-19T20:31:19.687 回答
0

在您的paintFareTableCells中,case 语句很可能会落入default,因此没有设置任何值。用断点确认这一点,并相应地修改您的列索引。

我希望这有帮助。

于 2013-05-20T23:01:22.723 回答
0

不幸的是,我不确定为什么您的单元格没有按应有的方式绘制,但我最好的猜测是您试图在它们处理它们的绘制事件之前更改它们的属性。正如 Joe Sisk 建议的那样,我设法通过事件改变了单元格的颜色,这对我来说效果很好。我希望它对你有帮助。不同的是我使用了 CellPainting 事件,这是我所做的简短版本,我希望它可以帮助你自己弄清楚其余的......

    private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.Value != null) // if condition is met, this cell will be painted
        {
            e.CellStyle.BackColor = Color.Black; // i used black color, feel free to replace it :)
        }
    }   

我希望这对你有用吗?

于 2013-08-29T09:25:31.383 回答