比较datagridview中的2个不同列

时间:2012-11-06 20:39:17

标签: c# winforms datagridview telerik

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

enter image description here

如果第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 个答案:

答案 0 :(得分: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以进行比较。

答案 1 :(得分:1)

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

的Rows属性
  

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

答案 2 :(得分:1)

对于验证检查,您需要使用FormattedValue property来查看用户想要在他们编辑的单元格中插入的值。您无法使用当前单元格值,因为在CellValidating完成而DataGridViewCellValidatingEventArgs.Cancel未设置为true之前,它不会更新为新值。

这样的事情:

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进行单元格验证,并向用户显示他必须输入数字的消息。

另一个快速说明:don't use empty catch blocks(虽然我意识到这可能不在您的生产代码中)。

答案 3 :(得分: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;                        
                }
            }
        }
    }

enter image description here