EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:基于自定义控件(ASP.NET)实施属性编辑器

本主题说明如何为ASP.NET应用程序实现属性编辑器。为了演示起见,在此示例中实现了一个整数属性编辑器。它在“编辑”模式下使用DropDownList控件,在“视图”模式下使用Label控件。

提示

您可以在XAF随附的FeatureCenter演示中看到此处实现的代码。默认情况下,此演示位于%PUBLIC%\ Documents \ DevExpress演示19.2 \ Components \ eXpressApp Framework \ FeatureCenter文件夹中。

注意

使用此示例不能集成使用ClientScriptManager.RegisterStartupScript方法的ASP.NET控件。如果需要集成这样的控件,请随时与我们的支持团队联系。

请按照以下步骤来实现ASP.NET属性编辑器。

  1. 在ASP.NET模块项目中,继承WebPropertyEditor类。请注意,您的课程应该是公开的。
  2. 应用PropertyEditorAttribute来指定将使用属性编辑器的数据类型(在此示例中为Int32)。如果将PropertyEditor属性的最后一个参数设置为true,则属性编辑器将用于任何业务类中的所有整数属性。
  3. 重写CreateViewModeControlCore方法,并返回WebControl子孙以在视图模式(此示例中为Label控件)中进一步使用它。请注意,如果您不覆盖此方法,则默认情况下将创建Label控件。由于在此模式下,自定义控件应该是只读的,因此,如果可以对使用中的控件进行一般性编辑,则有必要手动禁用编辑数据的功能。为此,请指定目标控件的CustomWebControl.ReadOnlyASPxWebControl.Enabled属性。另外,请确保指定一个唯一的Control.ID值(请参阅如何动态创建控件)。
  4. 重写CreateEditModeControlCore方法,并返回WebControl子孙以在编辑模式(此示例中为DropDownList控件)中进一步使用它。在此阶段,您可以设置创建的控件,订阅必需的事件,并在必要时为其提供数据源。注意,根据使用中的控件,设置控件的技术可能有所不同。确保指定一个唯一的Control.ID值(请参阅如何动态创建控件)。
  5. 确定当用户更改编辑值时(例如ListControl.SelectedIndexChanged事件),将发生控件在编辑模式下运行的哪个事件。请参阅控件的文档以找到适当的事件。订阅此事件并调用EditValueChangedHandler方法(该方法在内部引发PropertyEditor.ControlValueChanged事件并调用PropertyEditor.WriteValue方法)。如果在发起回调(回发)之前用户已更改客户端(在浏览器中)的值,则在任何回调(回发)期间都应调用EditValueChangedHandler方法。
  6. 重写GetControlValueCore方法,并返回由“编辑”模式下使用的WebPropertyEditor.Editor控件指定的值。请注意,返回的数据类型应与编辑属性数据类型相同。
  7. 重写ReadEditModeValueCore方法,并将PropertyEditor.PropertyValue对象传递给该属性,该属性指定创建的WebPropertyEditor.Editor控件的创建内容,以在编辑模式下运行(此示例中为ListControl.SelectedValue属性)。
  8. 重写ReadViewModeValueCore方法,然后将PropertyEditor.PropertyValue对象传递给该属性,该属性指定创建的WebPropertyEditor.InplaceViewModeEditor控件的创建内容,以在视图模式下运行(此示例中为Label.Text属性)。

下面的代码根据上面列出的步骤演示CustomIntegerEditor类的实现。

using System;
using System.Drawing;
using System.Web.UI.WebControls;
using DevExpress.ExpressApp.Model;
using DevExpress.ExpressApp.Editors;
using DevExpress.ExpressApp.Web.Editors;
//...
[PropertyEditor(typeof(Int32), false)]
public class CustomIntegerEditor : WebPropertyEditor {
    public CustomIntegerEditor(Type objectType, IModelMemberViewItem info) : base(objectType, info) { }
    protected override WebControl CreateViewModeControlCore() {
        Label control = new Label();
        control.ID = "editor";
        return control;
    }
    protected override WebControl CreateEditModeControlCore() {
        DropDownList control = new DropDownList();
        control.ID = "editor";
        control.Items.Add("0");
        control.Items.Add("1");
        control.Items.Add("2");
        control.Items.Add("3");
        control.Items.Add("4");
        control.Items.Add("5");
        control.SelectedIndexChanged  = control_SelectedIndexChanged;
        return control;
    }

    void control_SelectedIndexChanged(object sender, EventArgs e) {
        EditValueChangedHandler(sender, e);
    }
    protected override object GetControlValueCore() {
        int result = 0;
        if(int.TryParse(((DropDownList)Editor).SelectedValue, out result)) {
            return result;
        }
        return 0;
    }
    protected override void ReadEditModeValueCore() {
        ((DropDownList)Editor).SelectedValue = ((int)PropertyValue).ToString();
    }
    protected override void ReadViewModeValueCore() {
        ((Label)InplaceViewModeEditor).Text = ((int)PropertyValue).ToString();
    }
}

另外,您可以重写SetupControl方法以实例化并设置为其提供自定义代码的控件。控件初始化时会调用此方法,因此建议在此处放置控件的自定义代码。

要使用CustomIntegerEditor属性编辑器编辑特定的属性值,请自定义应用程序模型。调用ASP.NET模块项目的模型编辑器,然后导航到所需的BOModel |。班级| 会员| 成员节点。将节点的IModelCommonMemberViewItem.PropertyEditorType属性设置为CustomIntegerEditor。此后,成员节点指定的属性将由CustomIntegerEditor在所有View中显示。要仅在特定的详细信息视图中使用CustomIntegerEditor属性编辑器,请使用视图|的PropertyEditorType属性| <DetailView> | 物品| 改为使用<PropertyEditor>节点。

注意

您可能需要实现IAppearanceFormat接口,并将条件外观模块的IAppearanceFormat.BackColorIAppearanceFormat.FontColorIAppearanceFormat.FontStyle设置手动应用于创建的控件。

相关文章

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