C# 在网格中从ActiveEditor更新数据源后立即定位的事件
我需要做的是根据网格中其他字段的值计算网格中一个字段的值。我需要在一个相关单元格中的值更改后运行此计算,但前提是该值为有效条目。编辑器/存储库的C# 在网格中从ActiveEditor更新数据源后立即定位的事件,c#,.net,devexpress,xtragrid,xtraeditors,C#,.net,Devexpress,Xtragrid,Xtraeditors,我需要做的是根据网格中其他字段的值计算网格中一个字段的值。我需要在一个相关单元格中的值更改后运行此计算,但前提是该值为有效条目。编辑器/存储库的EditValueChanged、Validating和Validated事件都发生在将数据发布回数据源之前。我想知道是否有任何事件可以让我在将数据发布回数据源之后,但在将控件返回给用户之前触发此计算 示例代码 //calculation functions private void SetCalcROP(MyObjectt Row) { //r
EditValueChanged
、Validating
和Validated
事件都发生在将数据发布回数据源之前。我想知道是否有任何事件可以让我在将数据发布回数据源之后,但在将控件返回给用户之前触发此计算
示例代码
//calculation functions
private void SetCalcROP(MyObjectt Row)
{
//rop = m/hr
TimeSpan ts = Row.ToTime - Row.FromTime;
double diffDepth = Row.EndDepth - Row.StartDepth;
if (ts.TotalHours > 0)//donot divide by 0
Row.ROP = diffDepth / ts.TotalHours;
else
Row.ROP = 0;
}
private void SetCalcDeltaP(MyObject Row)
{
Row.DeltaPress = Row.SPPOnBtm - Row.SPPOffBtm;
}
//events
private void repNumberInput_Validated(object sender, EventArgs e) //is actaully ActiveEditor_Validated
{
if (vwDDJournal.FocusedColumn.Equals(colSPPOff) || vwDDJournal.FocusedColumn.Equals(colSPPOn))
SetCalcDeltaP(vwDDJournal.GetFocusedRow() as MyObject);
}
private void repNumberInput_NoNulls_Validated(object sender, EventArgs e) //is actaully ActiveEditor_Validated
{
if (vwDDJournal.FocusedColumn.Equals(colStartDepth) || vwDDJournal.FocusedColumn.Equals(colEndDepth))
SetCalcROP(vwDDJournal.GetFocusedRow() as MyObject);
}
private void repTimeEdit_Validated(object sender, EventArgs e) //is actaully ActiveEditor_Validated
{
SetCalcROP(vwDDJournal.GetFocusedRow() as MyObject);
}
private void repNumberInput_NoNulls_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
TextEdit TE = sender as TextEdit;
//null is not valid for this entry;
if (string.IsNullOrEmpty(TE.Text))
{
e.Cancel = true;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn, "This Column may not be blank");
return;
}
else
{
double tmp;
if (!Double.TryParse(TE.Text, out tmp))
{
e.Cancel = true;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn, "This Column must contain a number");
return;
}
}
}
private void repNumberInput_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
TextEdit TE = sender as TextEdit;
//null is not valid for this entry;
if (!string.IsNullOrEmpty(TE.Text))
{
double tmp;
if (!Double.TryParse(TE.Text, out tmp))
{
e.Cancel = true;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn, "This Column must contain a number");
return;
}
}
}
private void repTimeEdit_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (vwDDJournal.FocusedColumn.Equals(colToTime))
{//dont bother to check from time
//TIME TRAVEL CHECK!!!!
DateTime FromTime = Convert.ToDateTime(vwDDJournal.GetRowCellValue(vwDDJournal.FocusedRowHandle, colFromTime));
TimeEdit te = sender as TimeEdit;
DateTime ToTime = Convert.ToDateTime(te.EditValue);
if (ToTime < FromTime)
{//TIME TRAVEL
e.Cancel = true;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn, "To Time must be greater than From Time");
return;
}
}
}
//计算函数
私有void SetCalcROP(MyObject行)
{
//机械钻速=米/小时
TimeSpan ts=Row.ToTime-Row.FromTime;
double diffDepth=Row.EndDepth-Row.StartDepth;
如果(ts.TotalHours>0)//不要除以0
Row.ROP=扩散深度/ts.TotalHours;
其他的
Row.ROP=0;
}
私有void SetCalcDeltaP(MyObject行)
{
Row.DeltaPress=Row.SPPOnBtm-Row.SPPOffBtm;
}
//事件
私有void repNumberInput\u已验证(对象发送方,事件参数)//实际上是ActiveEditor\u已验证
{
if(vwDDJournal.FocusedColumn.Equals(ColsPoff)| | vwDDJournal.FocusedColumn.Equals(ColsPon))
SetCalcDeltaP(vwDDJournal.GetFocusedRow()作为MyObject);
}
private void repNumberInput\u NoNulls\u Validated(对象发送方,事件参数)//实际上是ActiveEditor\u Validated
{
if(vwdjournal.FocusedColumn.Equals(colStartDepth)| vwdjournal.FocusedColumn.Equals(colEndDepth))
SetCalcROP(vwDDJournal.GetFocusedRow()作为MyObject);
}
私有void repTimeEdit\u已验证(对象发送方,事件参数)//实际上是ActiveEditor\u已验证
{
SetCalcROP(vwDDJournal.GetFocusedRow()作为MyObject);
}
私有void repNumberInput\u NoNulls\u验证(对象发送方,System.ComponentModel.CancelEventArgs e)
{
TextEdit TE=发送者为TextEdit;
//null对于此条目无效;
if(string.IsNullOrEmpty(TE.Text))
{
e、 取消=真;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn,“此列不能为空”);
返回;
}
其他的
{
双tmp;
如果(!Double.TryParse(TE.Text,out tmp))
{
e、 取消=真;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn,“此列必须包含数字”);
返回;
}
}
}
私有void repNumberInput\u验证(对象发送方,System.ComponentModel.CancelEventArgs e)
{
TextEdit TE=发送者为TextEdit;
//null对于此条目无效;
如果(!string.IsNullOrEmpty(TE.Text))
{
双tmp;
如果(!Double.TryParse(TE.Text,out tmp))
{
e、 取消=真;
vwDDJournal.SetColumnError(vwDDJournal.FocusedColumn,“此列必须包含数字”);
返回;
}
}
}
私有void repTimeEdit_验证(对象发送方,System.ComponentModel.CancelEventArgs e)
{
if(vwDDJournal.FocusedColumn.Equals(colToTime))
{//不用费心不时检查
//时间旅行支票!!!!
DateTime FromTime=Convert.ToDateTime(vwDDJournal.GetRowCellValue(vwDDJournal.FocusedRowHandle,colFromTime));
TimeEdit te=发送方作为TimeEdit;
DateTime-ToTime=Convert.ToDateTime(te.EditValue);
如果(ToTime
问题是,无论我从哪里调用它,无论我使用vwDDJournal.GetRowCellValue(…)
还是vwDDJournal.GetFocusedRow()作为MyObject
,我都会得到旧的编辑值
要求
我必须在运行计算之前验证输入。
更改后我必须立即运行计算。如何
CustomCellValue
发回数据源后,刷新数据
无论何时更新数据或更改视图,都会调用它
。。。我需要做的是根据网格中其他字段的值计算网格中一个字段的值
完成此任务的最佳方法是使用特性
以下示例演示如何通过处理事件来实现此功能:
原始示例:
还可以使用以下方法实现未绑定列的计算值:
似乎找不到那个事件。它属于什么?我检查了网格、视图、存储库和列。请记住,我正在使用DevExpress库中的XtraGrid和GridView。我认为ValidatingEditor事件是最好的。否则,DevExpress XtraGrid将获得与Excel Sum()类似的summary列。也许这会容易得多。看起来不错。有没有一种简单的方法可以将相同的值绑定回数据源,或者也需要手动处理?我接受了这个答案,因为它确实有效,但我选择在代码中使用不同的解决方法。我进入了基本对象本身,并没有存储需要计算的值,而是将属性设置为返回计算本身。现在,它是返回计算的对象的“仅获取”属性。与只计算一次并存储值相比效率更低,但效率更高。
// Provides data for the Total column.
void gridView1_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) {
if (e.Column.FieldName == "Total" && e.IsGetData) e.Value =
getTotalValue(e.ListSourceRowIndex);
}
// Returns the total amount for a specific row.
decimal getTotalValue(int listSourceRowIndex) {
DataRow row = nwindDataSet.Tables["Order Details"].Rows[listSourceRowIndex];
decimal unitPrice = Convert.ToDecimal(row["UnitPrice"]);
decimal quantity = Convert.ToDecimal(row["Quantity"]);
decimal discount = Convert.ToDecimal(row["Discount"]);
return unitPrice * quantity * (1 - discount);
}
GridColumn columnTotal = new GridColumn();
columnTotal.FieldName = "Total";
columnTotal.Caption = "Total";
columnTotal.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
columnTotal.UnboundExpression = "[Quantity] * [UnitPrice] * (1 - [Discount])";
gridView1.Columns.Add(columnTotal);