【发布时间】: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