文章出處
文章列表
在 Windows 窗體應用程序中,按下回車或雙擊列表會打開默認的詳細視圖。
在 ASP.NET Web 應用程序中,單擊對象時執行此操作。
這一行為是由 ListViewProcessCurrentObjectController 的 ListViewProcessCurrentObjectController.ProcessCurrentObjectAction 按鈕所定義的。
可以將此操作替換為自定義的簡單操作。下面演示如何執行此操作。
有下面的BO定義,地址記錄。
[DefaultClassOptions, ImageName("BO_Contact")] public class AddressBookRecord : BaseObject { public AddressBookRecord(Session session) : base(session) { } private string name; public string Name { get { return name; } set { SetPropertyValue("Name", ref name, value); } } private string email; public string Email { get { return email; } set { SetPropertyValue("Email", ref email, value); } } private string phoneNumber; public string PhoneNumber { get { return phoneNumber; } set { SetPropertyValue("PhoneNumber", ref phoneNumber, value); } } }
現在并為AddressBookRecord 對象操作加一個WriteMailController,并填加 WriteMail Action。這個操作將調用與最終用戶的計算機上的 MailTo 協議相關聯的程序。說白了就是發個郵件,調用郵件客戶端。
using System.Diagnostics; // ... public class WriteMailController : ViewController { private SimpleAction writeMailAction; public WriteMailController() { TargetObjectType = typeof(AddressBookRecord); writeMailAction = new SimpleAction(this, "WriteMail", PredefinedCategory.Edit); writeMailAction.ToolTip = "Write e-mail to the selected address book record"; writeMailAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject; writeMailAction.ImageName = "BO_Contact"; writeMailAction.Execute += writeMailAction_Execute; } void writeMailAction_Execute(object sender, SimpleActionExecuteEventArgs e) { AddressBookRecord record = (AddressBookRecord)e.CurrentObject; string startInfo = String.Format( "mailto:{0}?body=Hello, {1}!%0A%0A", record.Email, record.Name); Process.Start(startInfo); } }
默認情況下,只有選中了列表中的一條記錄后,再點擊上面我們填加的按鈕,才會執行調用郵件客戶端的動作。
下面,我們演示,在win中雙擊列表,即執行上面的動作。
using DevExpress.ExpressApp.SystemModule; // ... public class WriteMailController : ViewController { // ... private ListViewProcessCurrentObjectController processCurrentObjectController; protected override void OnActivated() { base.OnActivated(); processCurrentObjectController = Frame.GetController<ListViewProcessCurrentObjectController>(); if (processCurrentObjectController != null) { processCurrentObjectController.CustomProcessSelectedItem += processCurrentObjectController_CustomProcessSelectedItem; } } private void processCurrentObjectController_CustomProcessSelectedItem(object sender, CustomProcessListViewSelectedItemEventArgs e) { e.Handled = true; writeMailAction.DoExecute(); } protected override void OnDeactivated() { if (processCurrentObjectController != null) { processCurrentObjectController.CustomProcessSelectedItem -= processCurrentObjectController_CustomProcessSelectedItem; } base.OnDeactivated(); } }
下面是效果:
這時你會發現,你沒辦法修改記錄了,即詳細視圖沒辦法顯示出來了。下面代碼來解決這樣的問題,即,加個控制器,實現這些功能。
using DevExpress.ExpressApp.SystemModule; // ... public class EditAddressBookRecordController : ViewController<ListView> { public EditAddressBookRecordController() { TargetObjectType = typeof(AddressBookRecord); SimpleAction editAddressBookRecordAction = new SimpleAction(this, "EditAddressBookRecord", PredefinedCategory.Edit); editAddressBookRecordAction.ImageName = "Action_Edit"; editAddressBookRecordAction.SelectionDependencyType = SelectionDependencyType.RequireSingleObject; editAddressBookRecordAction.Execute += editAddressBookRecordAction_Execute; } void editAddressBookRecordAction_Execute(object sender, SimpleActionExecuteEventArgs e) { ListViewProcessCurrentObjectController.ShowObject( e.CurrentObject, e.ShowViewParameters, Application, Frame, View); } }
注意:在web中沒這個問題,所以不用管。
文章列表
全站熱搜