EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

列表视图列生成

eXpressApp框架根据自动生成所有的列表视图应用模型的信息。本主题描述用于生成默认的“列表视图”列集的特定规则。

注意

列生成逻辑在ModelListViewColumnsNodesGenerator类中声明,该类是节点生成器(请参见在代码中扩展和自定义应用程序模型)。

简单属性列生成

在本节中,将为以下持久性类生成简单的属性列:

public class ObjectA : BaseObject {
    public ObjectA(Session session) : base(session) { }
    private string propertyA1;
    private string propertyA2;
    public string PropertyA1 {
        get { return propertyA1; }
        set { SetPropertyValue(nameof(PropertyA1), ref propertyA1, value); }
     }
    public string PropertyA2 {
        get { return propertyA2; }
        set { SetPropertyValue(nameof(PropertyA2), ref propertyA2, value); }
    }
}

ListView控件的和LookupListView节点包含这个类生成的子节点。在Mobile应用程序中,除了Columns之外,还生成RowLayout节点及其子节点(Columns的节点不影响List View布局-它仅基于RowLayout节点)。下图说明了模型编辑器中的这些节点:

ListViewColumns_1

使用IModelNode.Index属性指定的列顺序与其声明顺序相对应。这些列的索引值为正或零时可见。

代码中应用的以下属性会影响列的可见性:

  • DefaultProperty和FriendlyKeyProperty属性

    如果该类具有默认或友好的键属性(请参见DefaultPropertyAttributeFriendlyKeyPropertyAttribute),则其“查找列表”视图将包含一个与此属性对应的单列。在常规列表视图中,默认属性列的索引为零,并首先显示。在Mobile应用程序中,ListViewLookupListViewRowLayout节点包含对应于默认属性的单个节点。要显示其他属性值,请向RowLayout节点添加新的Layout View Items 。下面的代码演示了正在使用的DefaultProperty属性,该图像演示了结果。

    [DefaultProperty(nameof(PropertyA2))]
    public class ObjectA : BaseObject {
        // ...
    

    ListViewColumns_2

    FriendlyKeyProperty属性具有相同的效果。

    如果业务类公开了名称中包含“名称”子字符串的属性(不包括继承的属性),则将其视为默认属性:

    public class ObjectA : BaseObject {
        // ...
        public string ObjectName {
            // ...
    

    ListViewColumns_3

    DefaultProperty属性覆盖此行为。

  • 可浏览属性

    如果使用Browsable属性装饰属性,并且将false作为参数传递,则不会生成相应的列(请参见BrowsableAttribute)。

  • VisibleInListView属性

    如果使用VisibleInListViewAttribute属性装饰属性并且将false作为参数传递,则会生成相应的列,但仍不可见。该节点的IModelNode.Index属性设置为-1。您可以使用“列选择器”或“模型编辑器”取消隐藏此类列(请参阅“在列表视图中更改字段布局和可见性”)。

  • VisibleInLookupListView属性

    当一个类具有默认属性时,XAF会在“查找列表”视图中为此属性生成一列。要在代码中添加列,请使用VisibleInLookupListViewAttribute装饰必需的属性,然后将true作为属性参数传递。当类没有默认属性时,所有属性列都会在“查找列表”视图中生成。要隐藏与某个属性对应的列,请使用VisibleInLookupListViewAttribute装饰属性,然后将false用作属性参数。

参考属性列生成

为了演示如何生成引用属性列,上一节中演示的持久性类将使用ObjectB类型的PropertyA3引用属性进行扩展

public class ObjectA : BaseObject {
    // ...
    private ObjectB propertyA3;
    public ObjectB PropertyA3 {
        get { return propertyA3; }
        set { SetPropertyValue(nameof(propertyA3), ref propertyA3, value); }
    }
}
[DefaultProperty(nameof(PropertyB2))]
public class ObjectB : BaseObject {
    public ObjectB(Session session) : base(session) { }
    private string propertyB1;
    public string PropertyB1 {
        get { return propertyB1; }
        set { SetPropertyValue(nameof(propertyB1), ref propertyB1, value); }
    }
    private string propertyB2;
    public string PropertyB2 {
        get { return propertyB2; }
        set { SetPropertyValue(nameof(propertyB2), ref propertyB2, value); }
    }
}

默认情况下,将生成一列以表示PropertyA3属性。在Mobile应用程序中,ListViewLookupListViewRowLayout节点包含一个与第一个属性相对应的节点:

ListViewColumns_4

在UI中,PropertyA3显示PropertyB2的值,因为PropertyB2ObjectB类的默认属性。

注意

在Mobile应用程序中,您需要将新的PropertyA3布局视图项添加到RowLayout节点以在列表视图中显示PropertyA3属性值。

如果PropertyA3属性由装饰ExpandObjectMembersAttributeExpandObjectMembers.InListView参数,那么所有的列对象B类的属性在生成的对象A列表视图。该ExpandObjectMembersAttribute在移动列表视图没有影响。

public class ObjectA : BaseObject {
    // ...
    [ExpandObjectMembers(ExpandObjectMembers.InListView)]
    public ObjectB PropertyA3 {
        // ...

ListViewColumns_5

在继承的类的列表视图中生成的列

考虑以下从ObjectA类派生的ObjectC类:

public class ObjectC : ObjectA {
    public ObjectC(Session session) : base(session) { }
    private string propertyC1;
    public string PropertyC1 {
         get { return propertyC1; }
        set { SetPropertyValue(nameof(propertyC1), ref propertyC1, value); }
    }
    private string propertyC2;
    public string PropertyC2 {
        get { return propertyC2; }
        set { SetPropertyValue(nameof(propertyC2), ref propertyC2, value); }
    }
}

通常,此类属性的列通常照常生成(请参见上面的ObjectA List Views列生成的说明)。派生属性的列生成为隐藏(带有-1索引)。请注意以下细节:

  • 派生类没有默认属性,而其祖先具有默认属性时的预期行为

    祖先类的default属性用作派生类的“列表视图”中的默认属性。在常规列表视图中,此属性的列获取零索引,并首先显示。在“查找列表视图”中,默认属性祖先类列是唯一生成的列。下面的图像示出了所生成的列时ProprertyA2对象A类默认属性:

    ListViewColumns_6

  • 派生类没有公共字段和属性时的预期行为

    在这种情况下,为派生类生成的列与祖先类的列相同,并且默认情况下它们都是可见的。祖先类的default属性用作派生类的“列表视图”中的默认属性。

默认列宽

每列都有一个IModelColumn.Width属性,用于在Windows Forms应用程序中指定其宽度。下表演示了默认宽度值:

物业类型 预设宽度 查找中的默认宽度
该属性是类的默认或友好键属性(请参见DefaultPropertyAttributeFriendlyKeyPropertyAttribute)。如果属性名称中包含“名称”(不包括继承的属性),则该属性也被视为默认属性。 400 340
短值类型属性-intfloatdoubledecimalcharbool 50 50
其他属性(字符串等) 70 50

通常,默认属性包含类中最详细的信息,因此会自动为其生成一个宽列。短类型值不会占用太多屏幕空间,并且它们的默认列很窄。

在ASP.NET Web XAF应用程序中,Web浏览器根据当前主题和所显示内容的样式确定列宽-Width属性无效。

列排序顺序

列表视图按默认属性值升序排序(如果默认属性类型为System.IComparable)。默认列的IModelColumn.SortIndex设置为0,而IModelColumn.SortOrder设置为ColumnSortOrder.Ascending。其他列具有默认的SortIndexSortOrder(分别为-1和ColumnSortOrder.None)值。

相关文章

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