精华内容
下载资源
问答
  • 转自原文C#使用属性控件添加属性窗口 第一步,创建应用程序中将要展现的字段属性为public公有属性。其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在属性控件中)。为了...

    转自原文 在C#中使用属性控件添加属性窗口

    第一步,创建在应用程序中将要展现的字段属性为public公有属性。其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在属性控件中)。为了设置相关的属性,必须设置下面的一些关于属性控件的属性值,如下表所示:


    属性值 含义
    CategoryAttribute 该属性对在Property控件中的属性按字母顺序进行归类
    DescriptionAttribute 其值为对每个属性的具体文字描述,将会显示在property控件的底部
    BrowsableAttribute 该值为是否在property控件中显示或者隐藏某个属性
    ReadOnlyAttribute 该值为某个属性值是否在property控件中只读
    DefaultValueAttribute 每个属性的默认值


    接下来,我们创建一个用户类,并且使用属性控件,使得可以在属性控件框中改变其值。我们先引入相关的命名空间:

    using System.ComponentModel;


    之后,创建相关的类,设置有关的属性,代码如下:

    /// Customer class to be displayed in the property grid

    /// </summary>

    /// [DefaultPropertyAttribute("Name")]


    public class Customer
    {
    private string _name;
    private int _age; 
    private DateTime _dateOfBirth; 
    private string _SSN; 
    private string _address; 
    private string _email; 
    private bool _frequentBuyer; 
    [CategoryAttribute("ID Settings"), DescriptionAttribute("Name of the customer")]   

    public string Name 
    {
    get 
    {
    return _name; 
    }
    set
    {
    _name = value;
    }
    }
    [CategoryAttribute("ID Settings"), DescriptionAttribute("Social Security Number of the customer")] 

    public string SSN
    {
    get
    {
    return _SSN;
    }
    set
    {
    _SSN = value;
    }
    }
    [CategoryAttribute("ID Settings"), DescriptionAttribute("Address of the customer")] 
    public string Address 
    {
    get
    {
    return _address;
    }
    set
    {
    _address = value;
    }
    }
    [CategoryAttribute("ID Settings"), DescriptionAttribute("Date of Birth of the Customer (optional)")]
    public DateTime DateOfBirth 
    {
    get { return _dateOfBirth; }
    set { _dateOfBirth = value; }
    }
    [CategoryAttribute("ID Settings"), DescriptionAttribute("Age of the customer")] 
    public int Age 

    get { return _age; } 
    set { _age = value; } 
    }
    [CategoryAttribute("Marketting Settings"), DescriptionAttribute("If the customer has bought more than 10 times, this is set to true")]
    public bool FrequentBuyer
    {
    get { return _frequentBuyer; }
    set { _frequentBuyer = value; }
    }
    [CategoryAttribute("Marketting Settings"), DescriptionAttribute("Most current e-mail of the customer")]
    public string Email 
    {
    get { return _email; }
    set { _email = value; } 
    }
    public Customer() { }
    }


    可以看到,在上面的代码中,我们对customer类中的属性进行了设置,如姓名,出生日期,地址等。
    接着,我们要为创建的customer类创建一个实例,并且将其与属性控件绑定。属性控件会自动根据类中对属性的相关设置,从而在界面中显示有关的属性,并且还可以进行编辑,比如,可以对生日属性进行修改,修改时会弹出日历控件框,十分方便。代码如下:

    private void Form1_Load(object sender, System.EventArgs e)
    {
    //创建bill对象,实例化CUSTOMER类 
    Customer bill = new Customer();
    //赋值给属性
    bill.Age = 50;
    bill.Address = " 114 Maple Drive ";
    bill.DateOfBirth = Convert.ToDateTime(" 9/14/78");
    bill.SSN = "123-345-3566";
    bill.Email = “bill@aol.com”
    bill.Name = "Bill Smith"; 
    //将对象绑定到property控件中
    propertyGrid1.SelectedObject = bill;
    }


    最后,运行程序,我们就得到了本文一开始图示的结果了。再来回顾下该程序,其中我们使用了CatrgoryAttribute属性,定义了id settings和MarketSettings,它们在属性控件中以分类的形式出现(注意它们前有个“+”号,点击可以展开看到其子属性)。同时,我们每当选择一个属性时,在属性控件框的下部,会同时显示该属性的相关描述。

    Property属性控件还有很多优点,本文只是对其做了简单介绍,希望能给读者启发。

     

    没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



        本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/6265482.html,如需转载请自行联系原作者

    展开全文
  • 开发自定义控件件时,有好些Design属性是要使用的,如ToolboxItem, ToolboxBitmap, Category, Description等等,不知道这些属性其实也可以将控件搞出来,不过,知道了,会令事件更加简单,令控件更加专业和实用。...

    在开发自定义控件件时,有好些Design属性是要使用的,如ToolboxItem, ToolboxBitmap, Category, Description等等,不知道这些属性其实也可以将控件搞出来,不过,知道了,会令事件更加简单,令控件更加专业和实用。有时,不知道用法,会令到项目的其他同事好烦,因为这个控件是你提供的。下面对一些常用的Design属性做一个简单的生产介绍。

    1. ToolboxItem

    有没有试过写一个用户控件后,想它不出现在工具箱中,当然有,有时候是控件的Designer部分没有写好或没写,有时候是控件一拖出来就报错,有时候是内部使用的控件,不想别人一引用DLL就出现控件。其它设置方法可以很简单。

    ToolboxItem(false)]
    public class MyPanel : UserControl
    {
    }
    

    这样就可以了。“可恶”的用户控件就自动隐藏了,不出现在工具箱中。不过,如果你不知道这样的话,可以会引来一大堆的烦事。

    2. ToolboxBitmap

    写好一个用户控件后,在工具箱中出来的是一个蓝色的齿轮,这就不是很漂亮了,也不能够直观地表达自己的意图。如果更不幸的你的控件的名称好难认的话,其它的开发者会很麻烦的。怎样才能让用户控件在工具箱中显示不同的图标呢?

    ToolboxBitmap(typeof(System.Windows.Forms.Panel))]
    public class MyPanel : UserControl
    {
    }
    

    这样就可以了,表示你所做的用户控件使用的图标是Panel的图标。
    如果不想用系统的图标,要使用自己的图标,可以这样

    [ToolboxBitmap(typeof(MyPanel), "WindowsApplication1.Images.MyPanel.bmp")]
    public class MyPanel : UserControl
    {
    }
    

    不过,一定要注意路径,WindowsApplication1.Images.MyPanel.bmp表示,解决方案是WindowsApplication1,目录是Images,文件名是MyPanel.bmp,同时,这个图片必须是“嵌入的资源”(点击文件,右键,属性,有一个文件属性,其中,在生成操作中,可以选择"嵌入的资源"

    3. Category与Description

    [Category("Appearance"), Description("阴影色")]
    public System.Drawing.Color ShadowColor { get {} set {} }
    

    这两个是经常都会写在一起的属性,Category表示类型,如属性框中所显示的外观,布局等,当然,你可以自己写一个,叫“自定义属性”,而Description就是这个属性的描述,用来说明属性有什么用途。这两个的设置相对都比较简单,可以说,一看就知道,不过提一下,Appearance是特殊的词,在属性面板中,它就是外观一栏。

    4. DefaultValue

    [DefaultValue(typeof(Color), "DarkGray")]
    public System.Drawing.Color ShadowColor { get {} set {} }
    

    用于设置默认的值,对于string,bool,int,可以直接写出来,如[DefaultValue(10)],这是可以的,不过,不是这三种类型的话,就比较麻烦,一定要先转化为string才能设置成功。如上面的DarkGray,这是系统定义的颜色,这还是比较好处理的。不过,如果是一些自定义的颜色,如颜色是128,0,128,你应该将128转为16进制,写成0x800080,前缀0x是一定要加的。最后就这样
    [DefaultValue(typeof(Color), "0x800080")]

    5. Browsable

     public partial class MyTextBox : TextBox
     {
            public MyTextBox()
            {
                var s = DefaultText;
                InitializeComponent();
            }
    
            [Browsable(true)]
            public string DefaultText {get;set;}
     }
    

    表示,将在属性面板中显示这个属性。
    在这里插入图片描述
    如果设置为false,将不会显示(但是仍然会在对应的*.Designer.cs中进行序列化),如:

    this.myTextBox1.DefaultText = null;//仍然会序列化
    this.myTextBox1.Location = new System.Drawing.Point(476, 151);
    this.myTextBox1.Name = "myTextBox1";
    this.myTextBox1.Size = new System.Drawing.Size(100, 21);
    this.myTextBox1.TabIndex = 0;
    

    6. DesignerSerializationVisibility

    表示,是否在*.Designer.cs文件中将设置的代码写出来,也就是是否要实现序列化。默认为
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]表示需要实现序列化。
    如果设置为hidden:

            [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
            public List<Person> Persons { get; set; }
    

    将不会被序列化:
    在这里插入图片描述
    如果自定义控件中有些属性不需要显示在属性面板或者不需要序列化时,建议hidden掉。


    参考:winform 自定义控件属性在属性面板中显示的问题

    展开全文
  • QT新建Qt Widgets Application项目,需要修改ui控件属性,得mainwindow这个类进行修改,如,ui-&gt;myQLabel-&gt;setText(“this is q1!”)等等,那么怎么分离出去的类进行修改呢?下面是一种很好的...

    QT新建Qt Widgets Application项目,需要修改ui控件属性,得在mainwindow这个类中进行修改,如,ui->myQLabel->setText(“this is q1!”)等等,那么怎么在分离出去的类中进行修改呢?下面是一种很好的方法。

    开始代码:

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include "ChangeUI.h"
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        ChangeUI *          m_changeUI;
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    mainwindow.cpp

    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        /*
         * 实例化对象
         * 将控件指针赋值给对象中定义的指针,想改变控件属性,就直接在对象中进行操作就可以了。
         */
        m_changeUI = new ChangeUI();
        m_changeUI->m_q1 = ui->Q1;
        m_changeUI->m_q2 = ui->Q2;
        m_changeUI->m_q3 = ui->Q3;
        m_changeUI->startChange();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    ChangeUI.h

    #ifndef CHANGEUI_H
    #define CHANGEUI_H
    
    #include <QLabel>
    
    class ChangeUI
    {
    public:
        ChangeUI();
        void startChange();
    
    public:
        /*
         * 定义几个QLabel指针
         * 这个是将mainwindow中的控件指针赋值给他们的
         * 就是将 m_q1 = ui->Q1(在mainwindow中进行)
         *
         */
        QLabel*     m_q1;
        QLabel*     m_q2;
        QLabel*     m_q3;
    };
    
    #endif // CHANGEUI_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    ChangeUI.cpp

    #include "ChangeUI.h"
    
    ChangeUI::ChangeUI()
    {
    
    }
    
    void ChangeUI::startChange()
    {
        /*
         * 对m_q1设置参数就是对 ui->Q1进行属性设置。
         *
         */
        m_q1->setText("this is q1!");
        m_q2->setText("this is q2!");
        m_q3->setText("this is q3!");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    上述就是一个简短的案例了,一般项目都有好多个类,好多个控件操作,初学者就需要好好的推敲琢磨怎么才能运用的更加好了。

    上面的方法是将指针赋值的方法,那么我们也可以通过信号和槽的方式进行控件属性的修改,大体意思,就是在其他类中计算出一个值,发个信号到mainwindow中,信号中携带相应参数,mainwindow接受到信号执行槽函数,槽函数中用ui->Q1->setText(“携带的参数”),这种方式进行控件属性的修改,具体可以参考 “QT,其他类中计算出的结果如何在ui界面的控件中显示?”

    转载:https://blog.csdn.net/leoeitail/article/details/77880042

    展开全文
  • 认真地看看页面声明控件的代码,你会发现控件属性在页面的表示千变万化。我们看看下面这些: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="控件属性在页面源码的表达方式.aspx.cs" ...

    一、属性在页面及源码中的表示方式

    认真地看看页面中声明控件的代码,你会发现控件属性在页面中的表示千变万化。我们看看下面这些:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="控件属性在页面源码中的表达方式.aspx.cs" 
    Inherits="CustomServerControlTest.控件属性在页面源码中的表达方式" %> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
    <title>控件属性在页面源码中的表达方式</title> 
    </head> 
    <body> 
    <form id="form1" runat="server"> 
    <div id="divOperation"> 
    当前页面所在程序集: 
    <%
       1: =System.Reflection.Assembly.GetExecutingAssembly().Location 
    %>
    </div> 
    <!-- ------------------------------------------------------------分割线------------------------------------------------------------ --> 
    <div id="divDemo"> 
    <asp:Label ID="Label1" runat="server" Text="Hello Label!"></asp:Label> 
    <asp:Label ID="Label2" runat="server">Hello Label!</asp:Label> 
    <asp:Label ID="Label3" runat="server" Text="Hello Label!" Font-Bold="true" Font-Size="14"></asp:Label>
    <asp:TextBox ID="TextBox1" runat="server">Hello TextBox!</asp:TextBox> 
    <asp:Panel ID="Panel1" runat="server">Hello Panel!</asp:Panel> 
    <asp:DropDownList ID="ddlGender" runat="server"> 
    <asp:ListItem Value="1"></asp:ListItem> 
    <asp:ListItem Value="0"></asp:ListItem> 
    </asp:DropDownList> 
    <asp:GridView ID="Gridview1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True"> 
    <Columns> 
    <asp:BoundField HeaderText="HeaderText1" /> 
    <asp:CheckBoxField HeaderText="HeaderText2" /> 
    </Columns> 
    <EditRowStyle BackColor="Red" /> 
    </asp:GridView> 
    </div> 
    <!-- ------------------------------------------------------------分割线------------------------------------------------------------ --> 
    </form> 
    </body> 
    </html> 

    再看看这些属性在源码中的表示:

    using CustomServerControlTest;
    using System;
    using System.Diagnostics;
    using System.Drawing;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Web;
    using System.Web.Profile;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    namespace ASP
    {
        [CompilerGlobalScope]
        public class 控件属性在页面源码中的表达方式_aspx : 控件属性在页面源码中的表达方式, IRequiresSessionState, IHttpHandler
        {
            private static bool __initialized;
            private static object __fileDependencies;
            protected DefaultProfile Profile
            {
                get
                {
                    return (DefaultProfile)this.Context.Profile;
                }
            }
            protected HttpApplication ApplicationInstance
            {
                get
                {
                    return this.Context.ApplicationInstance;
                }
            }
            [DebuggerNonUserCode]
            public 控件属性在页面源码中的表达方式_aspx()
            {
                base.AppRelativeVirtualPath = "~/控件属性在页面源码中的表达方式.aspx";
                if (!控件属性在页面源码中的表达方式_aspx.__initialized)
                {
                    控件属性在页面源码中的表达方式_aspx.__fileDependencies = base.GetWrappedFileDependencies(new string[]
                    {
                        "~/控件属性在页面源码中的表达方式.aspx"
                    });
                    控件属性在页面源码中的表达方式_aspx.__initialized = true;
                }
                base.Server.ScriptTimeout = 30000000;
            }
            [DebuggerNonUserCode]
            private HtmlTitle __BuildControl__control3()
            {
                return new HtmlTitle();
            }
            [DebuggerNonUserCode]
            private HtmlHead __BuildControl__control2()
            {
                HtmlHead __ctrl = new HtmlHead("head");
                HtmlTitle __ctrl2 = this.__BuildControl__control3();
                IParserAccessor __parser = __ctrl;
                __parser.AddParsedSubObject(__ctrl2);
                return __ctrl;
            }
            //--------------------------------------------------------------分割线--------------------------------------------------------------
            [DebuggerNonUserCode]
            private Label __BuildControlLabel1()
            {
                Label __ctrl = new Label();
                this.Label1 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "Label1";
                __ctrl.Text = "Hello Label!";
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private Label __BuildControlLabel2()
            {
                Label __ctrl = new Label();
                this.Label2 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "Label2";
                IParserAccessor __parser = __ctrl;
                __parser.AddParsedSubObject(new LiteralControl("Hello Label!"));
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private Label __BuildControlLabel3()
            {
                Label __ctrl = new Label();
                this.Label3 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "Label3";
                __ctrl.Text = "Hello Label!";
                __ctrl.Font.Bold = true;
                __ctrl.Font.Size = new FontUnit(new Unit(14.0, UnitType.Point));
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private TextBox __BuildControlTextBox1()
            {
                TextBox __ctrl = new TextBox();
                this.TextBox1 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "TextBox1";
                __ctrl.Text = "Hello TextBox!";
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private Panel __BuildControlPanel1()
            {
                Panel __ctrl = new Panel();
                this.Panel1 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "Panel1";
                IParserAccessor __parser = __ctrl;
                __parser.AddParsedSubObject(new LiteralControl("Hello Panel!"));
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private ListItem __BuildControl__control5()
            {
                return new ListItem
                {
                    Value = "1",
                    Text = "男"
                };
            }
            [DebuggerNonUserCode]
            private ListItem __BuildControl__control6()
            {
                return new ListItem
                {
                    Value = "0",
                    Text = "女"
                };
            }
            [DebuggerNonUserCode]
            private void __BuildControl__control4(ListItemCollection __ctrl)
            {
                ListItem __ctrl2 = this.__BuildControl__control5();
                __ctrl.Add(__ctrl2);
                ListItem __ctrl3 = this.__BuildControl__control6();
                __ctrl.Add(__ctrl3);
            }
            [DebuggerNonUserCode]
            private DropDownList __BuildControlddlGender()
            {
                DropDownList __ctrl = new DropDownList();
                this.ddlGender = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "ddlGender";
                this.__BuildControl__control4(__ctrl.Items);
                return __ctrl;
            }
            [DebuggerNonUserCode]
            private BoundField __BuildControl__control8()
            {
                return new BoundField
                {
                    HeaderText = "HeaderText1"
                };
            }
            [DebuggerNonUserCode]
            private CheckBoxField __BuildControl__control9()
            {
                return new CheckBoxField
                {
                    HeaderText = "HeaderText2"
                };
            }
            [DebuggerNonUserCode]
            private void __BuildControl__control7(DataControlFieldCollection __ctrl)
            {
                BoundField __ctrl2 = this.__BuildControl__control8();
                __ctrl.Add(__ctrl2);
                CheckBoxField __ctrl3 = this.__BuildControl__control9();
                __ctrl.Add(__ctrl3);
            }
            [DebuggerNonUserCode]
            private void __BuildControl__control10(TableItemStyle __ctrl)
            {
                __ctrl.BackColor = Color.Red;
            }
            [DebuggerNonUserCode]
            private GridView __BuildControlGridview1()
            {
                GridView __ctrl = new GridView();
                this.Gridview1 = __ctrl;
                __ctrl.ApplyStyleSheetSkin(this);
                __ctrl.ID = "Gridview1";
                __ctrl.AutoGenerateColumns = false;
                __ctrl.EnableModelValidation = true;
                this.__BuildControl__control7(__ctrl.Columns);
                this.__BuildControl__control10(__ctrl.EditRowStyle);
                return __ctrl;
            }
            //--------------------------------------------------------------分割线--------------------------------------------------------------
            [DebuggerNonUserCode]
            private HtmlForm __BuildControlform1()
            {
                HtmlForm __ctrl = new HtmlForm();
                this.form1 = __ctrl;
                __ctrl.ID = "form1";
                Label __ctrl2 = this.__BuildControlLabel1();
                IParserAccessor __parser = __ctrl;
                __parser.AddParsedSubObject(__ctrl2);
                Label __ctrl3 = this.__BuildControlLabel2();
                __parser.AddParsedSubObject(__ctrl3);
                Label __ctrl4 = this.__BuildControlLabel3();
                __parser.AddParsedSubObject(__ctrl4);
                TextBox __ctrl5 = this.__BuildControlTextBox1();
                __parser.AddParsedSubObject(__ctrl5);
                Panel __ctrl6 = this.__BuildControlPanel1();
                __parser.AddParsedSubObject(__ctrl6);
                DropDownList __ctrl7 = this.__BuildControlddlGender();
                __parser.AddParsedSubObject(__ctrl7);
                GridView __ctrl8 = this.__BuildControlGridview1();
                __parser.AddParsedSubObject(__ctrl8);
                __ctrl.SetRenderMethodDelegate(new RenderMethod(this.__Renderform1));
                return __ctrl;
            }
            private void __Renderform1(HtmlTextWriter __w, Control parameterContainer)
            {
                __w.Write("\r\n    <div id=\"divOperation\">\r\n        当前页面所在程序集:\r\n        ");
                __w.Write(Assembly.GetExecutingAssembly().Location);
                __w.Write("\r\n    </div>\r\n    \r\n    <div id=\"divDemo\">\r\n        ");
                parameterContainer.Controls[0].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[1].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[2].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[3].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[4].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[5].RenderControl(__w);
                __w.Write("\r\n        ");
                parameterContainer.Controls[6].RenderControl(__w);
                __w.Write("\r\n    </div>\r\n    ");
            }
            [DebuggerNonUserCode]
            private void __BuildControlTree(控件属性在页面源码中的表达方式_aspx __ctrl)
            {
                this.InitializeCulture();
                ((IParserAccessor)__ctrl).AddParsedSubObject(new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n"));
                HtmlHead __ctrl2 = this.__BuildControl__control2();
                ((IParserAccessor)__ctrl).AddParsedSubObject(__ctrl2);
                ((IParserAccessor)__ctrl).AddParsedSubObject(new LiteralControl("\r\n<body>\r\n    "));
                HtmlForm __ctrl3 = this.__BuildControlform1();
                ((IParserAccessor)__ctrl).AddParsedSubObject(__ctrl3);
                ((IParserAccessor)__ctrl).AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n"));
            }
            [DebuggerNonUserCode]
            protected override void FrameworkInitialize()
            {
                base.FrameworkInitialize();
                this.__BuildControlTree(this);
                base.AddWrappedFileDependencies(控件属性在页面源码中的表达方式_aspx.__fileDependencies);
                base.Request.ValidateInput();
            }
            [DebuggerNonUserCode]
            public override int GetTypeHashCode()
            {
                return -1997224554;
            }
            [DebuggerNonUserCode]
            public override void ProcessRequest(HttpContext context)
            {
                base.ProcessRequest(context);
            }
        }
    }

    哦,顺便也看看父类的一部分,看看继承了什么?

    //------------------------------------------------------------------------------
    // <自动生成>
    // 此代码由工具生成。
    //
    // 对此文件的更改可能会导致不正确的行为,并且如果
    // 重新生成代码,这些更改将会丢失。
    // </自动生成>
    //------------------------------------------------------------------------------
    namespace CustomServerControlTest
    {
        public partial class 控件属性在页面源码中的表达方式
        {
            /// <summary>
            /// form1 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.HtmlControls.HtmlForm form1;
            /// <summary>
            /// Label1 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.Label Label1;
            /// <summary>
            /// Label2 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.Label Label2;
            /// <summary>
            /// Label3 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.Label Label3;
            /// <summary>
            /// TextBox1 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.TextBox TextBox1;
            /// <summary>
            /// Panel1 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.Panel Panel1;
            /// <summary>
            /// ddlGender 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.DropDownList ddlGender;
            /// <summary>
            /// Gridview1 控件。
            /// </summary>
            /// <remarks>
            /// 自动生成的字段。
            /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
            /// </remarks>
            protected global::System.Web.UI.WebControls.GridView Gridview1;
        }
    }

    我们做个对应表好了:

    序号

    页面中的表示方式

    源码中的表示方式

    <asp:Label ID="Label1" runat="server" Text="Hello Label!"></asp:Label>
    Label1.ID = "Label1";
    Label1.Text = "Hello Label!";

    <asp:Label ID="Label2" runat="server">Hello Label!</asp:Label>
    Label2.ID = "Label2"; 
     
    Label2.Controls.Add(new LiteralControl("Hello Label!"));

    <asp:Label ID="Label3" runat="server" Text="Hello Label!" Font-Bold="true" Font-Size="14"></asp:Label>
    Label3.ID = "Label3";
    Label3..Text = "Hello Label!";
    Label3.Font.Bold = true;
    Label3.Font.Size = new FontUnit(new Unit(14.0, UnitType.Point));

    <asp:TextBox ID="TextBox1" runat="server">Hello TextBox!</asp:TextBox>
    TextBox1.ID = "TextBox1";
    TextBox1.Text = "Hello TextBox!";

    <asp:Panel ID="Panel1" runat="server">Hello Panel!</asp:Panel>
    Panel1.ID = "Panel1";
    Panel1.Controls.Add(new LiteralControl("Hello Panel!"));

    <asp:DropDownList ID="ddlGender" runat="server">
                <asp:ListItem Value="1"></asp:ListItem>
                <asp:ListItem Value="0"></asp:ListItem>
    </asp:DropDownList>
    ddlGender.ID = "ddlGender";
    ddlGender.Items.Add( new ListItem{Value = "1",Text = "男"});
    ddlGender.Items.Add( new ListItem{Value = "0",Text = "女"});
     

    <asp:GridView ID="Gridview1" runat="server" AutoGenerateColumns="False" EnableModelValidation="True">
        <Columns>
            <asp:BoundField HeaderText="HeaderText1" />
            <asp:CheckBoxField HeaderText="HeaderText2" />
        </Columns>
        <EditRowStyle BackColor="Red" />
    </asp:GridView>
    Gridview1.ID = "Gridview1";
    Gridview1.AutoGenerateColumns = false;
    Gridview1.EnableModelValidation = true;
    Gridview1.Columns.Add(new BoundField{HeaderText = "HeaderText1"});
    Gridview1.Columns.Add(new CheckBoxField{HeaderText = "HeaderText2"});
    Gridview1.EditRowStyle .BackColor = Color.Red;

    二、处理嵌套内容

    开始之前,先看一下概念,什么是嵌套内容?嵌套内容是指服务器起始标签与服务器结束标签间的元素集。

    我们对比对应表中②、④发现同样是嵌套内容,有的被解析成了属性,有的被解析成了子控件。这种对服务器控件标记中嵌套内容的解析行为是怎么控制的呢?

    1、ParseChildrenAttribute登场:

    ParseChildrenAttribute:是一个类级别的属性。使用 ParseChildrenAttribute 类指示页分析器应如何处理页上声明的服务器控件标记中的嵌套内容。

    命名空间:System.Web.UI
    程序集:System.Web(在 system.web.dll 中)

    ParseChildrenAttribute类的构造函数有以下四个重载版本:

    名称 说明
    ParseChildrenAttribute () 初始化 ParseChildrenAttribute 类的新实例。ChildrenAsProperties 属性默认为false。
    ParseChildrenAttribute (Boolean) 使用 ChildrenAsProperties 属性初始化 ParseChildrenAttribute 类的新实例,以确定服务器控件标记中的嵌套内容是否被分析为服务器控件的属性。
    ParseChildrenAttribute (Type) 使用 ChildControlType 属性初始化 ParseChildrenAttribute 类的新实例,以确定服务器控件标记中的嵌套内容哪些元素将被分析为控件。
    ParseChildrenAttribute (Boolean, String) 使用 childrenAsProperties 和 defaultProperty 参数初始化 ParseChildrenAttribute 类的新实例。 defaultProperty 用于指定服务器控件标记中的嵌套内容解析成哪个属性的值。

    Lable因为装饰了[ParseChildren(false)]而将其嵌套内容解析为子控件:

    [ParseChildren(false)]
    public class Label : WebControl, ITextControl
    {
         //... ...
    }

    TextBox因为装饰了[ParseChildren(true, "Text")]而将其嵌套内容解析成属性值,并赋值给Text属性:

    [ParseChildren(true, "Text")]
    public class TextBox : WebControl, IPostBackDataHandler, IEditableTextControl, ITextControl
    {
         //... ...
    }

    2、PersistChildrenAttribute登场:

    PersistChildrenAttribute:是一个类级别的属性,使用 PersistChildrenAttribute类指示设计器应如何处理页上声明的服务器控件标记中的嵌套内容。

    命名空间:System.Web.UI
    程序集:System.Web(在 system.web.dll 中)

    名称 说明
    PersistChildrenAttribute(Boolean) 使用persist属性初始化PersistChildrenAttribute类的新实例,以告知设计服务器控件标记中的嵌套内容是否仍是控件。
    PersistChildrenAttribute(Boolean, Boolean) 用persist属性和UsesCustomPersistence属性初始化 PersistChildrenAttribute 类的新实例。  persist属性指示是否将嵌套内容作为嵌套控件保持,UsesCustomPersistence属性指示是否使用自定义的保持方法。

    注:ParseChildrenAttribute和PersistChildrenAttribute常同时出现,ParseChildrenAttribute将对控件标签内嵌套内容的解析行为告知页分析器;PersistChildrenAttribute将对控件标签内嵌套内容的解析行为告知设计器,但两者构造函数的参数的意义不同。ParseChildrenAttribute的参数为ChildrenAsProperties ,表示是否解析为属性;PersistChildrenAttribute的参数为persist,表示是否将嵌套内容作为嵌套控件保持。所以控件上如果出现[ParseChildren(false)]就会出现[PersistChildren(true)],反之亦然。

    [ParseChildren(false), PersistChildren(true)]
    public class Panel : WebControl
    {
         //... ...
    }

    3、PersistenceModeAttribute登场:

    PersistenceModeAttribute:是一个元素级别的属性。用于指定控件属性的保存(持久化)方式,它接受一个枚举类型参数:PersistenceMode,其枚举值及意义如下表:

    名称 说明
    Attribute 指定属性或事件保持为特性。
    EncodedInnerDefaultProperty 指定属性保存为控件的唯一嵌套内容。当属性为字符串且是HTML编码时,只能对该属性做这种指定。
    InnerDefaultProperty 指定属性保存为控件的唯一嵌套内容。
    InnerProperty 指定属性在 ASP.NET 服务器控件中保持为嵌套标记。 这通常用于复杂对象,它们具有自己的持久性属性。

    ①EncodedInnerDefaultProperty:

    我们上面说到TextBox因为装饰了[ParseChildren(true, "Text")]而将其嵌套内容解析成Text属性的属性值,相应的TextBox的Text属性也被修饰上了[PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)],使得Text成为TextBox唯一嵌套内容,而且如果嵌套内容中存在标签格式的文本,解析器页不会把这些标签进行进一步解析。

    [ParseChildren(true, "Text")]
    public class TextBox : WebControl, IPostBackDataHandler, IEditableTextControl, ITextControl
    {
         //... ...
         [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
         public virtual string Text
         {
              //... ...   
         }
         //... ...
    }

    ②InnerDefaultProperty:

    我们再看DropDownList的父类ListControl。它装饰了[ParseChildren(true, "Items")]而将其嵌套内容解析成Items属性的属性值,相应的ListControl的Text属性也被修饰上了[PersistenceMode(PersistenceMode.InnerDefaultProperty)],使得Items成为ListControl唯一嵌套内容。

    [ParseChildren(true, "Items")]
    public abstract class ListControl : DataBoundControl, IEditableTextControl, ITextControl
    {
         //... ...
         [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
         public virtual ListItemCollection Items
         {
              //... ...   
         }
         //... ...
    }

    也正因为Items是ListControl唯一的嵌套内容,所以对应表⑥中才可以省略Items标签,直接设置Items的值。

    <asp:DropDownList ID="ddlGender" runat="server">
        <Items> <!-- 可省略Items标签 -->
            <asp:ListItem Value="1"></asp:ListItem> <!-- 直接设置Items值,就可以了...-->
            <asp:ListItem Value="0"></asp:ListItem>
        </Items>
    </asp:DropDownList>

    ③InnerProperty:

    复杂的控件通常有多个属性需要持久化在嵌套内容里。这些属性会被装饰上[PersistenceMode(PersistenceMode.InnerProperty)],比如GridView。

    [ParseChildren(true)]    //在GridView实现代码中没有装饰[ParseChildren(true)],该特性继承自WebControl。
    public class GridView : CompositeDataBoundControl, IPostBackContainer, IPostBackEventHandler, ICallbackContainer, ICallbackEventHandler, IPersistedSelector
    {
         //... ...
         [PersistenceMode(PersistenceMode.InnerProperty)]
         public virtual DataControlFieldCollection Columns
         {
              //... ...   
         }
         [PersistenceMode(PersistenceMode.InnerProperty)]
         public TableItemStyle EditRowStyle
         {
              //... ...   
         }
         //... ...
         //... ...
    }

    三、源代码视图控件

    实现代码:

    using System.Web.UI;
    using System.Text.RegularExpressions;
    using System.Web;
    namespace CustomServerControl
    {
        [ParseChildren(true,"Text"),PersistChildren(false)]
        public class SourceView:Control
        {
            //清除源代码前多余的换行符所用的正则表达式
            static Regex _regTrimBeginCarriageReturn = new Regex(@"^(\r\n)+", RegexOptions.Compiled | RegexOptions.Multiline);
            //清除源代码后多余的换行符所用的正则表达式
            static Regex _regTrimEndCarriageReturn = new Regex(@"(\r\n)+$", RegexOptions.Compiled);
            [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
            public string Text
            {
                set
                {
                    this.ViewState["Text"] = value;
                }
                get
                {
                    object obj = this.ViewState["Text"];
                    if (null == obj)
                    {
                        return string.Empty;
                    }
                    return (string)obj;
                }
            }
            protected override void Render(HtmlTextWriter writer)
            {
                string sourceCode = _regTrimBeginCarriageReturn.Replace(this.Text, string.Empty);
                sourceCode = _regTrimEndCarriageReturn.Replace(sourceCode, string.Empty);
                sourceCode = HttpUtility.HtmlEncode(sourceCode); //Html编码
                sourceCode = sourceCode.Replace(" ", "&nbsp;").Replace("\r\n", "<br/>");
                writer.Write(sourceCode);
            }
        }
    }

    测试代码:

    <%@ page language="C#" autoeventwireup="true" codebehind="SourceViewTest.aspx.cs"
        inherits="CustomServerControlTest.SourceViewTest" %>
     
    <%@ register assembly="CustomServerControl" namespace="CustomServerControl" tagprefix="csc" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <csc:sourceview id="SourceView1" runat="server"> 
    <html> 
    <head> 
    <title>Hello SourceView!</title> 
    </head> 
    <body> 
    <form> 
    <h1>SourceView Test</h1> 
    </form> 
    </body> 
    </html> 
    </csc:sourceview>
        </div>
        </form>
    </body>
    </html>

    测试截图:

    clipboard

    四、总结

    1、嵌套内容是指服务器起始标签与服务器结束标签间的元素集。

    2、嵌套内容可以解析成了属性(集合),也可以解析成子控件(集合)。这需要ParseChildrenAttribute告知页分析器,PersistChildrenAttribute告知设计器。

    3、简单控件嵌套内容中通常用来持久化最重要的一个属性,复杂控件嵌套内容中通常用来持久化控件中不易于用标签属性表达的复杂属性。需要持久化到嵌套内容的属性需装饰PersistenceModeAttribute。

    作者:韩兆新
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    本文转自韩兆新博客博客园博客,原文链接:http://www.cnblogs.com/hanzhaoxin/p/4100890.html,如需转载请自行联系原作者
    展开全文
  • 不是子窗口使用主窗口的控件 是修改控件,不是变量 我要实现的具体功能是窗口单击按钮打开一个新窗口,此时该按钮失效,当关闭打开的新窗口时,激活该按钮。这样做的目的是为了避免每点击一次该按钮,就生成一个...
  • 有一个自定义控件userControl,使用这个控件的界面myForm,我想通过下面的语句将userControl的右键菜单项“btnAdd”隐藏起来: myForm.btnEdit.Visibility = BarItemVisibility.Never; 要想这样做需要做一个...
  • android我们习惯了XML布局文件,进行控件属性的设置,由于控件默认提供的属性数量有限,为了增加属性我们可以给控件添加一些自定义的属性,下面来讲一下为控件添加自定义属性的几个步骤。 1>res/values...
  • 当我们自己定义一个自定义控件时,需要用到自己定义的属性下面我们将会这样的去动态的添加自定义的属性。 《1》首先定义属性类型: private int i = 1; //定义私有成员i为整形 《2》添加字符的描述 ...
  • 可设置控件CheckForIllegalCrossThreadCalls属性值为false 或线程加入下面代码: void 线程名() {  if(控件.InvodeRequired)  {  DelegateFunction df=new
  • 下面我就来简单介绍一下这个属性的用法: 本人也是初学者,我谨把我每天学习的心得体会和大家分享一下!愿意与大家一起进步!欢迎前来探讨,也请前辈不吝赐教,已到达共同进步之目的。这里在下一并谢过,多谢...
  • 但这里不讨论这种方法),所以需要结合onConfigurationChange方法代码对布局的属性参数做一些修改,对于如何做的修改写此文作为记录总述:修改布局主要有下面三步1.通过控件对象获取对应的布局参数对象2.用参数...
  • QT新建Qt Widgets Application项目,需要修改ui控件属性,得mainwindow这个类进行修改,如,ui->myQLabel->setText("this is q1!")等等,那么怎么分离出去的类进行修改呢?下面是一种很好的方法。
  • 在下面的MFC项目绑定控件如下 ![图片说明](https://img-ask.csdn.net/upload/201606/03/1464933883_745790.png) 很诡异的是在绑定的类CDTest根本就没有那个test属性 ![图片说明]...
  • 自定义控件中属性

    千次阅读 2007-10-24 15:19:00
    文件名:Usercontrol.cs处定义控件时要设置其默认属性.可以用[DefaultValue( )]来设置,但是它并不是支持所有的类型如Font类和其它的自定义的类.这时可以用Reset+属性名做成一个方法来,设计窗体中用重置来设置默认...
  • android 自定义控件属性

    千次阅读 2010-05-12 12:15:00
    Attrs.xml这个文件是用来定义控件属性的文件,结合下面例子来详细说明这个文件。 这行代码定义了控件的名称HwExControl; 这行代码定义了控件一个属性,我不知道这个称为属性是否合适,它定义了一个字符串(format...
  • 实际的用户控件使用,当需要将用户控件中,某个控件的系统属性和用户控件定义的依赖属性绑定时,可以使用下面这个。 IsOpen="{Binding ParasPopupIsOpen, RelativeSource={RelativeSource FindAncestor, ...
  • 因为一个label需要一个显示的值和一个实际的value,我通过下面代码将一个label赋上了两个值。 <asp:datalistid="dlKPIItem"runat="server"BorderWidth="1px"CellPadding="1"><ItemStyleBorderWidth="1px"&...
  • oc如何修改控件的一些只读属性

    千次阅读 2016-01-08 11:32:14
    我们的平时的开发,有时候需要自定义一些控件,比如说TabBar  使用的时候,就需要让控制器的self.tabBar指向我们自定义的一些tabBar  但是控制器的tabBar是readonly只读属性的,我们需要使用一些特殊的...
  • Winform进行页面设计时,常使用控件的Dock属性来进行布局调整。但是由于设置属性的顺序问题,导致达不到想要的效果。 比如以下两个控件 下面控件设置的Dock属性是Bottom,即页面底部,那么再设置上面...
  • duilib入门三之控件属性

    千次阅读 2015-11-30 23:50:20
    要想写好duilib的界面,必须了解它的控件属性,它的属性实在太多,不一定能够全部记得住,只好将作者原文贴下面了。duilib源码的专门有一个文档讲到这些属性 ...
  • 对于使用Tab Control 给对话框加属性页的方法有很多,下面记录下感觉比较方便点的方法。(也是来自网上的资料,只是稍加整理) 首先需要自己建一个类,如:CTabSheet。这个类是从CTabCtrl继承来的,是用于Tab ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,022
精华内容 1,208
关键字:

在下面控件属性中