首页 > 解决方案 > 在按键上更改 WinForm DataGridView 中的颜色

问题描述

我在 aDataGridView中有三列相互依赖。让我们分别将它们标记为第 1、2 和 3 列。在这种情况下,第 1 列必须小于第 2 列,第 2 列必须小于第 3 列。

如果我在单元格颜色中调用SetValidBandByRow()下面的函数,sysIdentGV_CellValueChanged则预期的浅粉色表示三个单元格之一存在错误,需要解决。但是,当SetValidBandByRow(...)KeyPress事件中调用它时,它会记录一个新值违反条件,但正在编辑的单元格不保留在 中设置的单元格颜色SetValidBandByRow(...)。为了解决这个问题,我KeyPress通过将文本框背景色设置为浅粉色来发现这一点,但是我得到了一个白色边框,请参阅下面的“编辑时”图像。

private void sysIdentGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    /*some other validation and building of the rltu object here */

    if(!SetValidBandByRow(rltu))
    {
        /*building error msg and displaying error*/
    }
    return;
}

private bool SetValidBandByRow(Tuple<int,double,double,double> rowLowerTransUpper)
{
    bool wasValid = true;

    if (rowLowerTransUpper.Item1 < 0 || rowLowerTransUpper.Item1 >= GV.RowCount)
        return wasValid;

    Color color = Color.White;
    if (!(rowLowerTransUpper.Item2 <= rowLowerTransUpper.Item3 && rowLowerTransUpper.Item3 <= rowLowerTransUpper.Item4))
    {
        color = Color.LightPink;
        wasValid = false;
    }

    GV.Rows[row].Cells[(int)GVEnum.lowerCutoff].Style.BackColor = color;
    GV.Rows[row].Cells[(int)GVEnum.TransFreq].Style.BackColor = color;
    GV.Rows[row].Cells[(int)GVEnum.upperCutoff].Style.BackColor = color;

    return wasValid;
}

设置tb.backcolorGV_Keypress(单元格仍处于焦点):

编辑时

未设置(单元格仍tb.backcolor处于GV_Keypress焦点状态):

编辑时

在设置 GV.Rows[row] 之后。Cells[(int)GVEnum.lowerCutoff].Style.BackColor 和 SelectionBackColor on GV_CellValueChanged

从文本框散焦后

我希望要么删除“编辑时”图像周围的空白,要么找到另一种似乎不太可行的方法。

这是我尝试将文本框设置为背景颜色的一些东西,但似乎没有像我预期的那样工作:

private void GV_KeyPress(object sender, KeyPressEventArgs e)
{

/*some other validation and building of the rltu object here */

//the result of the section below can be seen in image 1 "Setting 
//active textbox back color" with out this section I get image two.

TextBox tb = (TextBox)GV.EditingControl;
if (!SetValidBandByRow(rltu))
{
    tb.Margin = new Padding(0);
    GV.CurrentCell.Style.BackColor = Color.LightPink;
    GV.CurrentCell.Style.SelectionBackColor = Color.LightPink;
    tb.BackColor = Color.LightPink;
}
else
    tb.BackColor = Color.White;
}

谢谢

标签: c#datagridviewkeypressbackcolor

解决方案


如果其他人想做类似的事情。这个问题在另一个堆栈溢出问题中得到了回答,可以在这里找到


推荐阅读