Validation 正在验证DevExpress GridControl中的单元格
只是一个简单的问题,我自己都管不了 我有一个用于Winforms(12.2)的DevExpress GridControl,其中填充了一些数值,网格是可编辑的,用户可以更改这些值 假设用户更改了一个单元格,我想验证这个单元格,以便在数据源中修改相应的值,而无需单击单元格外侧的A 也就是说,我希望用户能够验证和应用所有值,只需按工具栏中的一个按钮,而不是单击enter、esc或在表中单击 我在看一些论坛,没有得到正确的答案Validation 正在验证DevExpress GridControl中的单元格,validation,devexpress,datasource,gridcontrol,Validation,Devexpress,Datasource,Gridcontrol,只是一个简单的问题,我自己都管不了 我有一个用于Winforms(12.2)的DevExpress GridControl,其中填充了一些数值,网格是可编辑的,用户可以更改这些值 假设用户更改了一个单元格,我想验证这个单元格,以便在数据源中修改相应的值,而无需单击单元格外侧的A 也就是说,我希望用户能够验证和应用所有值,只需按工具栏中的一个按钮,而不是单击enter、esc或在表中单击 我在看一些论坛,没有得到正确的答案 谢谢,在菜单项的处理程序中,单击执行以下操作: private menuI
谢谢,在菜单项的处理程序中,单击执行以下操作:
private menuItem_Click(object sender, EventArgs e)
{
gridView1.UpdateCurrentRow(); //return a bool, false = if validation error(s) was found
}
这将强制视图验证输入并将其下推到数据源。这取决于您要执行的操作。你有两个选择。验证行并返回显示错误消息的messagebox。或者你可以在牢房里放一个红色的“x” 这两种方法都有效。但是需要稍微不同的实现。这两种方法都要求您订阅gridview的Validate row事件,而不是gridcontrol 像这样的东西会给你一个文本框
private void gridView1_ValidateRow(object sender,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
{
e.Valid = false;
}
像这样的东西会给你细胞里的红色“x”
private void gridView1_ValidateRow(object sender,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) {
GridView view = sender as GridView;
GridColumn inStockCol = view.Columns["UnitsInStock"];
GridColumn onOrderCol = view.Columns["UnitsOnOrder"];
//Get the value of the first column
Int16 inSt = (Int16)view.GetRowCellValue(e.RowHandle, inStockCol);
//Get the value of the second column
Int16 onOrd = (Int16)view.GetRowCellValue(e.RowHandle, onOrderCol);
//Validity criterion
if (inSt < onOrd) {
//Set errors with specific descriptions for the columns
view.SetColumnError(inStockCol, "The value must be greater than Units On Order");
view.SetColumnError(onOrderCol, "The value must be less than Units In Stock");
}
}
private void gridView1\u ValidateRow(对象发送方,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs(e){
GridView视图=发送方作为GridView;
GridColumn inStockCol=view.Columns[“UnitsInStock”];
GridColumn OnOrderColl=view.Columns[“UnitsOnOrder”];
//获取第一列的值
Int16 inSt=(Int16)view.GetRowCellValue(e.RowHandle,inStockCol);
//获取第二列的值
Int16 onOrd=(Int16)view.GetRowCellValue(e.RowHandle,onOrderCol);
//有效性标准
如果(安装
信息可在此处找到:
这仍然需要用户退出单元格
我在这里找到了更多信息:公认的答案UpdateCurrentRow()完全按照它所说的做-它强制视图更新其结果,如果由于验证错误而无法更新,则返回false。但这并不是全部 要导致验证错误,需要使用ValidateRow或ValidatingEditor。所以这些是一起使用的 区别在于ValidatingEditor在字段之间移动时工作 这个例子取自这里
对我来说,这个方法将数据源对象的当前值转储到覆盖用户值的行中。我正在寻找相反的行为。UpdateCurrentRow正在返回true。我已经查看了DevExpress文档,似乎您的解释是正确的,但仍然不起作用,有什么想法吗?@danijepg您是否在gridview上处理任何其他事件?鼠标单击、RowCellStyle和CustomDrawCell,但它们都与验证单元格无关。鼠标单击仅用于菜单。我试图修改的单元格没有自定义编辑器,它是一个整数。由于其他问题,此属性的setter正在抛出一个奇怪的异常。updateCurrentRow运行良好,因此您的解决方案是正确的。谢谢
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;
private void gridView1_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) {
ColumnView view = sender as ColumnView;
GridColumn column = (e as EditFormValidateEditorEventArgs)?.Column ?? view.FocusedColumn;
if (column.Name != "colBudget") return;
if ((Convert.ToInt32(e.Value) < 0) || (Convert.ToInt32(e.Value) > 1000000))
e.Valid = false;
}
private void gridView1_InvalidValueException(object sender, InvalidValueExceptionEventArgs e) {
ColumnView view = sender as ColumnView;
if (view == null) return;
e.ExceptionMode = ExceptionMode.DisplayError;
e.WindowCaption = "Input Error";
e.ErrorText = "The value should be greater than 0 and less than 1,000,000";
// Destroy the editor and discard the changes made within the edited cell.
view.HideEditor();
}
Private Function ValidateView(view As ColumnView) As Boolean
If view.IsEditing Then
view.CloseEditor()
Return view.UpdateCurrentRow()
End If
Return True
End Function