在我的datagridview
中,有四列1& 2是只读col 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)
{
}
}
答案 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)
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;
}
}
}
}