我在DataGridView
中有两列:
如果我输入的receiveQuantity大于orderdQuantity,那么在该单元TextChanged
事件上,我想显示ErrorIcon。
目前,它没有像我之前描述的那样起作用。目前的工作原理是,如果我点击DataGridview
的其他单元格,则会显示ErrorIcon
。
我的代码如下:
//txtBox_TextChanged is called in datagridview1_EditingControlShowing() event
private void txtBox_TextChanged(object sender, EventArgs e)
{
try
{
if (datagridview1.Rows.Count > 0)
{
if (txtBox.Text != "")
{
int rowIndex = datagridview1.CurrentRow.Index;
int recQty = Convert.ToInt32(txtBox.Text);
int orderedQty = Convert.ToInt32(datagridview1.Rows[rowIndex].Cells["Ordered Qty"].Value);
if (recQty > orderedQty)
{
this.datagridview1.CurrentCell.ErrorText = "Invalid Quantity";
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Oops something went wrong.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
答案 0 :(得分:0)
当用户在单元格中输入时,如何显示错误图标?
默认情况下,为单元格设置ErrorText
时,单元格处于编辑模式时不会显示错误图标。当用户在单元格中键入时,DataGridView
的任何事件都不会处理文本的更改。
要在用户键入单元格时设置错误文本并显示错误图标,您应该按照以下步骤操作:
EditingControlShowing
中的编辑控件并处理其TextChanged
事件。 TextChanged
事件中,为单元格设置或删除ErrorText
。CellBeginEdit
事件中对单元格应用右边的填充,然后在CellEndEdit
中将其删除。CellPainting
事件中的绘制错误图标。示例强>
此示例显示单元格中的错误,而如果单元格的文本变为空,则用户键入第一个单元格。
在EditingControlShowing
附加TextChanged
事件中TextBox
:
void grid_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)
{
if (this.grid.CurrentCell.ColumnIndex == 0)
{
var textbox = e.Control as DataGridViewTextBoxEditingControl;
if (textbox != null)
{
textbox.TextChanged -= textBox_TextChanged;
textbox.TextChanged += textBox_TextChanged;
}
}
}
在TextChanged
TextBox
事件中执行验证并删除或设置单元格ErrorText
:
void textBox_TextChanged(object sender, EventArgs e)
{
var textbox = (TextBox)sender;
if (string.IsNullOrEmpty(textbox.Text))
this.grid.CurrentCell.ErrorText = "Invalid Value";
else
this.grid.CurrentCell.ErrorText = null;
}
在CellBeginEdit
中添加右侧填充以显示错误图标,并在CellEndEdit
中删除填充:
void grid_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
var cell = grid.Rows[e.RowIndex].Cells[e.ColumnIndex];
cell.Style.Padding = new Padding(0, 0, 18, 0);
}
void grid_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
var cell = grid.Rows[e.RowIndex].Cells[e.RowIndex];
cell.Style.Padding = new Padding(0, 0, 0, 0);
}
在CellPainting
中自己绘制错误图标:
private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
e.Paint(e.ClipBounds, DataGridViewPaintParts.All &
~(DataGridViewPaintParts.ErrorIcon));
if (!String.IsNullOrEmpty(e.ErrorText))
{
GraphicsContainer container = e.Graphics.BeginContainer();
e.Graphics.TranslateTransform(e.CellStyle.Padding.Right, 0);
e.Paint(e.CellBounds, DataGridViewPaintParts.ErrorIcon);
e.Graphics.EndContainer(container);
}
e.Handled = true;
}