2

在我datagridview的 1 和 2 四列是只读的,列 3 和 4 有数字值。我想比较第 4 列必须大于第 3 列。例如:

在此处输入图像描述

如果第 4 列值小于第 3 列,那么我想建议消息不会导航到另一个控件。

我的简单方法似乎不起作用。对于这种情况,如何比较 2 个特定列?

private void datagridview_CellValidating(object sender, CellValidatingEventArgs e)
{
    try
    {
        int bbor = datagridview.CurrentCell.ColumnIndex;
        int ebor = datagridview.CurrentCell.RowIndex;
        if (ebor <= bbor)
        {
            MessageBox.Show("Please verify the value");
            e.Cancel = true;
        }
    }
    catch (Exception exception)
    {
    }
}
4

4 回答 4

1

对于您的验证检查,您需要使用该FormattedValue属性来查看您的用户想要在他们编辑的单元格中插入什么值。您不能使用当前单元格值,因为它在未设置为 true的CellValidating情况下完成后才会更新为新值。DataGridViewCellValidatingEventArgs.Cancel

像这样的东西:

private void datagridview_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
    // This is the new proposed value the user entered; could be for column 3 or 4.
    int newValue = int.Parse(e.FormattedValue.ToString());

    // See which column fired the CellValidating event and use the new proposed value for it
    // in place of the cell's actual value for purposes of our validation.
    int col3Value = (e.ColumnIndex == 2) ? newValue : (int)dataGridView1[2, e.RowIndex].Value;
    int col4Value = (e.ColumnIndex == 3) ? newValue : (int)dataGridView1[3, e.RowIndex].Value;

    if (col3Value <= col4Value) {
        MessageBox.Show("Please verify the value");
        e.Cancel = true;
    }
}

我在这里展示的代码是为了演示您的问题的解决方案。在您的实际生产代码中,您需要验证从 object 到 int 的转换是否成功(通过int.TryParse)或捕获此操作失败时引发的异常。发生这种情况时,您可以Cancel = true对单元格进行验证并向用户显示他必须输入数字的消息。

另一个快速说明:不要使用空的 catch 块(尽管我意识到这可能不在您的生产代码中)。

于 2012-11-06T21:38:56.827 回答
1

我们再见面。使用 cell_click 事件:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex != 0)
    {
        if (Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()) <= Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
        {
            MessageBox.Show("Please verify the value");
        }
    }
}

编辑1:这似乎工作正常,让我知道。

private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
    if (e.ColumnIndex != 0)
    {
        if (Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()) <= Double.Parse(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
        {
            MessageBox.Show("Please verify the value");
            e.Cancel = true;
        }
    }
}

编辑 2:更新 Telerik 控件

private void radGridView1_CellValidating(object sender, Telerik.WinControls.UI.CellValidatingEventArgs e)
    {
        if (e.ColumnIndex != 0)
        {
            if (e.Value != null && radGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value != null)
            {
                if (Double.Parse(e.Value.ToString()) <= Double.Parse(radGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex - 1].Value.ToString()))
                {
                    MessageBox.Show("error");
                    e.Cancel = true;                        
                }
            }
        }
    }

在此处输入图像描述

于 2012-11-06T21:51:14.880 回答
1

我或多或少会看到类似的东西:

如果要检查所有行:

DataRow dr;
for(int i = datagridview.Rows.Count-1; i > 0; i--) {
    dr = datagridview.Rows[i];
    if(dr[e.ColumnIndex] > dr[e.ColumnIndex+1]){
            //your message code     
            e.Cancel = true;
        break; (or return;)
    }
}

如果您只想检查正在编辑单元格的当前行:

DataRow dr = datagridview.Rows[e.RowIndex];
e.Cancel = dr[e.ColumnIndex] > dr[e.ColumnIndex+1];
if(e.Cancel)
    //your message code

也许您需要将对象转换为 int 进行比较。

于 2012-11-06T20:52:39.463 回答
1

请参阅 DataGridView 的 Rows 属性http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rows.aspx

this.dataGridView1[col, row].Value

为每一行引用一个特定的单元格

foreach (Row r in this.dataGridView1.Rows) {
    if (r.Cells[3].Value <= r.Cells[2].Value ) {
    System.Console.WriteLine ("error");
    }
}
于 2012-11-06T21:01:54.977 回答