Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在网格中从ActiveEditor更新数据源后立即定位的事件_C#_.net_Devexpress_Xtragrid_Xtraeditors - Fatal编程技术网

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