zoukankan      html  css  js  c++  java
  • WSS自定义字段问题:在 RenderPattern 中使用自定义属性


    字段配置文件如下:
    FieldTypes

    PropertySchema中声明了一个自定义属性:ExportTemplate,但是这个属性无法在RenderPattern中引用,如上面配置文件的写法,
    <Property Select="ExportTemplate"/>输出始终为空。
    反射系统的SPFileText的实现,它声明了类似的MaxLength等属性:

    MaxLength

    采用了internal string SetFieldAttributeValue(string attrName, string attrValue) 方法添加属性,这种属性是可以在RenderPattern用
    <Property Select="MaxLength"/>引用的。但是这个方法是internal的,我们的代码无法使用。
    好在我们有反射,利用反射是可以调用一个类的非公共方法的。
    我们重载SPField的OnAdded和OnUpdated方法,当自定义属性改变时同步到字段的标准属性:

    public override void OnAdded(SPAddFieldOptions op)
            
    {
                
    base.OnAdded(op);
                SyncProperty();          
            }

            
    public override void OnUpdated()
            
    {
                
    base.OnUpdated();
                SyncProperty();
            }

            
    /// <summary>
            
    /// 将自定义属性同步到Property,便于在fldtypes_文件中使用
            
    /// </summary>

            void SyncProperty()
            
    if (GetAttributeValue(ExportTemplate_PropertyName) == this.ExportTemplate) return//防止递归
                SetAttributeValue(ExportTemplate_PropertyName, 
    this.ExportTemplate);
                
    this.Update();
            }

            
    /// <summary>
            
    /// 设置属性值,利用反射调用基类的internal方法
            
    /// fldtypes_中的RenderPattern无法调用到 CustomProperty,所有把CustomProperty同步到Property
            
    /// </summary>
            
    /// <param name="name"></param>
            
    /// <param name="value"></param>
            
    /// <returns></returns>

            protected string SetAttributeValue(string name, string value)
            
    {  Type t = typeof(SPField);            object obj = t.InvokeMember("SetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                
    nullthisnew object[] { name , value });
                
    return "" + obj;
            }

            
    /// <summary>
            
    /// 获取属性值,利用反射调用基类的internal方法
            
    /// </summary>
            
    /// <param name="name"></param>
            
    /// <returns></returns>

            protected string GetAttributeValue(string name)
            
    {
                Type t 
    = typeof(SPField);            object obj = t.InvokeMember("GetFieldAttributeValue", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                
    nullthisnew object[] { name });
                
    return "" + obj;
            }

    OK,问题解决。

    关于自定义字段的开发可以参考以下文章:
    http://www.cnblogs.com/shangmeizhai/archive/2007/04/15/714274.html

    可能大家看得有点云里雾里(懒阿,没有好好去写~),但相信这篇文章对碰到同样问题的兄弟是有价值的。



  • 相关阅读:
    读码的逻辑设计
    简单拼接图像的tile_images和tile_images_offset算子
    select_shape_proto算子的几种特征模式含义解析
    Photoshop中的高斯模糊、高反差保留和Halcon中的rft频域分析研究
    sort_contours_xld算子的几种排序方式研究
    Region在connection前后进行“交并差”等操作的异同
    Halcon中xld的常见特征的含义总结
    Halcon选择一堆region中面积第N大的region的算法实现
    从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同
    Halcon阈值化算子dual_threshold和var_threshold的理解
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/1021707.html
Copyright © 2011-2022 走看看