如何在Cell TextChange上的DataGridViewCll中显示ErrorIcon?

时间:2016-03-17 12:37:24

标签: c# winforms datagridview

我在DataGridView中有两列:

  • orderdQuantity
  • receivedQuantity

如果我输入的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);
    }
}

1 个答案:

答案 0 :(得分:0)

当用户在单元格中输入时,如何显示错误图标?

默认情况下,为单元格设置ErrorText时,单元格处于编辑模式时不会显示错误图标。当用户在单元格中键入时,DataGridView的任何事件都不会处理文本的更改。 要在用户键入单元格时设置错误文本并显示错误图标,您应该按照以下步骤操作:

  • 获取EditingControlShowing中的编辑控件并处理其TextChanged事件。
  • 在文本框的TextChanged事件中,为单元格设置或删除ErrorText
  • 在开始编辑时,在CellBeginEdit事件中对单元格应用右边的填充,然后在CellEndEdit中将其删除。
  • CellPainting事件中的绘制错误图标。

enter image description here

示例

此示例显示单元格中的错误,而如果单元格的文本变为空,则用户键入第一个单元格。

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