【问题标题】:Changing colors in WinForm DataGridView on keypress在按键上更改 WinForm DataGridView 中的颜色
【发布时间】:2021-08-13 20:09:32
【问题描述】:

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

如果我在sysIdentGV_CellValueChanged 中调用下面的SetValidBandByRow() 函数,则单元格颜色是预期的浅粉色,表示三个单元格之一存在错误,需要解决。但是,当从KeyPress 事件调用SetValidBandByRow(...) 时,它会记录一个新值违反条件,但正在编辑的单元格不保留在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;
}

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

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

设置后 GV.Rows[row].Cells[(int)GVEnum.lowerCutoff].Style.BackColor 和 GV_CellValueChanged 上的 SelectionBackColor:

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

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

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;
}

谢谢

【问题讨论】:

  • 我没有关注你想要做的事情。 IF 三 (3) 个单元格中的至少一 (1) 个单元格中的至少一 (1) 个值大于下一个单元格,THEN 只为该单元格或整行着色?此外,“KeyPressed”代码在“哪里”?在代码的最后一个 sn-p 中,我可以看到 TextBox 是从网格 EditingControl 创建的,但是“KeyPressed”代码在哪里。换句话说,如果在单元格处于编辑模式时按下多个键,则发布的代码都不会被执行。
  • 我猜……这就是你想要的……当用户开始输入其中一个单元格时,你希望一旦用户输入的数字更大,单元格就会变成粉红色比下一个单元格?换句话说,您希望“何时”对单元格进行着色?当用户“键入”或用户“离开”单元格时。你能澄清一下吗?
  • 我建议您仔细阅读 SO tour 部分,因为它显示了 SO 的工作原理。 How to Ask 部分可能会有所帮助。此外,您可能会发现 SO Asking 部分很有用。创建完整的minimal reproducible example 是快速获得答案的一种方法。
  • @JohnG 是的,抱歉,我应该提供更多上下文。理想情况下,当用户“打字”时,单元格会改变颜色。所以按键,确定新字符串是否会违反条件,并且没有边界的整个单元格将是浅粉色,并且一旦散焦就会保持这种状态。我将编辑我的帖子以使其更加清晰。

标签: c# datagridview keypress backcolor


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-17
    • 2017-03-09
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多