EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:访问在当前视图中选择的对象

使用XAF应用程序时,最终用户可以选择View中显示的对象。您可能经常需要从ControllersActions中访问这些对象以执行各种业务任务。例如,在实现一个Action时,您可能需要在执行Action时访问一个重点对象来修改其属性值。本主题说明了操作聚焦对象和选定对象的基础,并提供了示例代码段。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E3016)中提供了完整的示例项目。

执行动作时访问当前选定的对象

执行动作时,将触发其执行事件。无论Action类型如何,传递给事件处理程序的参数都包含SimpleActionExecuteEventArgs.CurrentObjectSimpleActionExecuteEventArgs.SelectedObjects属性。该CurrentObject属性指定活动视图的当前对象。如果活动视图是列表视图,则此属性指定焦点对象。如果视图是局部视图,则该属性指定该视图显示的对象。该的selectedObjects是在活动视图中选择的对象的集合。对于明细视图,此属性返回包装在列表中的CurrentObject

下面的代码片段演示了一个用于Contact类型的Action。执行该动作时,它将在行列表视图或详细视图中显示的对象的注释属性值中添加一行显示信息(大约是薪水转账的信息)的新行。

using System;
using System.Collections;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.ExpressApp.EF;
//...
public partial class MyNotesController : ViewController {
    public MyNotesController() {
        SimpleAction myAction = new SimpleAction(this, "Salary Info", "Edit");
        myAction.SelectionDependencyType = SelectionDependencyType.RequireMultipleObjects;
        myAction.TargetObjectType = typeof(Contact);
        myAction.Execute  = myAction_Execute;
        Actions.Add(myAction);
    }
    void myAction_Execute(object sender, SimpleActionExecuteEventArgs e) {
        ArrayList SelectedContacts = new ArrayList();
        if ((e.SelectedObjects.Count > 0) && (e.SelectedObjects[0] is IObjectRecord)) {
            foreach (var selectedObject in e.SelectedObjects) {
                SelectedContacts.Add((Contact)ObjectSpace.GetObject(selectedObject));
            }
        }
        else {
            SelectedContacts = (ArrayList)e.SelectedObjects;
        }
        foreach (Contact selectedContact in SelectedContacts) {
            DateTime now = DateTime.Now;
            selectedContact.Notes  = "\r\n[INFO] Your salary is transfered "   
                now.ToString("M/d/yy")   " at "   now.ToString("hh:mm");
        }
        ObjectSpace.CommitChanges();
        ObjectSpace.Refresh();
    }
}
注意

使用上面的代码,每个选定的Contact对象都是通过单独的数据库请求获得的。

通过指定Execute事件处理程序的ActionBaseEventArgs.ShowViewParameters属性或使用PopupWindowShowAction来执行Action时,可以显示特定的View 。但是,无论Action类型如何,Execute事件处理程序参数始终包含针对其调用了Action的View的焦点对象和选定对象,而不包含因Action而显示的View的焦点对象和选定对象。

使用视图控制器访问当前选定的对象

较不常见的任务是从控制器访问View的焦点对象和选定对象。在这种情况下,应使用由ViewController.View属性指定的View对象的View.CurrentObjectView.SelectedObjects属性。View对象公开的属性具有相应的更改通知事件-View.CurrentObjectChanged和View.SelectionChanged。因此,从Controller访问聚焦对象和选定对象的最佳方法是处理这些事件。

以下代码段演示了用于联系人列表视图的控制器。它更改DeleteObjectsViewController.DeleteActionActionBase.ConfirmationMessage。如果你要删除一个联系人,在全名中的联系方式是将要被删除的都会被添加到ConfirmationMessage。如果要删除多个联系人,则将添加所选的联系人计数。

using System;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.SystemModule;
// ...
public class MyConfirmationController : ObjectViewController<ListView, Contact> {
    private string defaultMessage;
    DeleteObjectsViewController deleteObjectsViewController;
    protected override void OnActivated() {
        base.OnActivated();
        deleteObjectsViewController = Frame.GetController<DeleteObjectsViewController>();
        if (deleteObjectsViewController != null) {
            defaultMessage = deleteObjectsViewController.DeleteAction.GetFormattedConfirmationMessage();
            View.SelectionChanged  = View_SelectionChanged;
            deleteObjectsViewController.DeleteAction.ConfirmationMessage = GetConfirmationMessage();
        }
    }
    private void View_SelectionChanged(object sender, System.EventArgs e) {
        deleteObjectsViewController.DeleteAction.ConfirmationMessage = GetConfirmationMessage();
    }
    private string GetConfirmationMessage() {
        if (View.SelectedObjects.Count > 1) {
            return String.Format("You are about to delete {0} Contacts. Do you want to proceed?", 
                View.SelectedObjects.Count);
        }
        string fullName = null;
        if (View.CurrentObject is Contact) {
            fullName = ViewCurrentObject.FullName;
        }
        else if ((View.CurrentObject is ObjectRecord) && (View.Editor is IObjectRecordSupport)) {
            fullName = (string)((IObjectRecordSupport)View.Editor).
                GetRecordMemberValue((ObjectRecord)View.CurrentObject, "FullName");
        }
        else if (View.CurrentObject is XafDataViewRecord) {
            fullName = (string)((XafDataViewRecord)View.CurrentObject)["FullName"];
        }
        return String.Format("You are about to delete the '{0}' Contact. Do you want to proceed?", fullName);
    }
    protected override void OnDeactivated() {
        base.OnDeactivated();
        if (deleteObjectsViewController != null) {
            View.SelectionChanged -= View_SelectionChanged;
            deleteObjectsViewController.DeleteAction.ConfirmationMessage = defaultMessage;
            deleteObjectsViewController = null;
        }
    }
}
注意

View.CurrentObjectView.SelectedObjects属性返回IObjectRecord包装,而不是原来的业务对象时,查看的数据视图,的ServerView,InstantFeedback,或InstantFeedbackView运行数据访问模式。若要获取真实的对象,请使用View.ObjectSpace.GetObject(obj)方法。

转载保留此链接,注明出处