代码之家  ›  专栏  ›  技术社区  ›  Hazior

在C中动态创建控件的方法#

  •  0
  • Hazior  · 技术社区  · 15 年前

    在C中动态创建控件的方法是什么?

    起初这是物体,但说控制更精确。我的术语一团糟。谢谢乔尔。

    编辑{ 运行时创建的控件。并且能够被程序访问和编辑。 这有帮助吗? }

    我喜欢动态创造的想法,想知道有什么方法可以做到这一点。

    请每个答案只有一个,我想看看人们是如何排列他们的。

    private Label _lblCLastName = new Label(); 
    private static List<ChildrenPanel> _ListCP = new List<ChildrenPanel>(); 
    
    public void CreatePanel(Panel Container) 
    { 
        // Created Controls
        #region Controls 
        _pnlStudent.Controls.Add(_lblCLastName); 
        //  
        // lblCLastName 
        //  
        _lblCLastName.AutoSize = true; 
        _lblCLastName.Location = new System.Drawing.Point(6, 32); 
        _lblCLastName.Name = "lblCLastName"; 
        _lblCLastName.Size = new System.Drawing.Size(58, 13); 
        _lblCLastName.TabIndex = 10; 
        _lblCLastName.Text = "Last Name"; 
    
        // Adds controls to selected forms panel 
        Container.Controls.Add(_pnlStudent); 
        // Creates a list of created panels inside the class 
        // So I can access user input 
        ListCP.Add(this); 
    
    } 
    

    这是一个代码片段,来自于我所说的内容。我又发了一个帖子,但没把问题贴好。我将删除它,但ATM仍然可以查看。

    如果仍然有问题,请建设性的,我不介意消极的投入,只要它是有帮助的。

    编辑: 我得到了一些我想要的答案。感谢所有回复的人。我也能把这个关上。如果有人能把它关上,我们会感激的。

    5 回复  |  直到 15 年前
        1
  •  2
  •   user113476    15 年前

    动态地创建GUI对象非常有用,但是对于维护来说,它也可能是一场噩梦。

    一个好的经验法则是限制动态创建的GUI对象的数量。

    有一种情况你可以 希望 使用动态创建的图形用户界面对象是指您不知道所需对象的数量或计数的情况。例如,结果集中每一行都有一个标签(即使这样,您也可以考虑使用DataGrid或GridView类型的对象)。

    这适用于WinForms和ASP.NET。只要确保正确地记录代码。

    我的建议是,为了更简单的窗体而使用可视化设计器,并且只在绝对必要时动态地创建和添加对象。

    (fwiw,您发布的代码片段可能会被简化和/或重构,因为它似乎走错了方向。)

        2
  •  9
  •   Hogan    15 年前

    我用 新的 关键字动态创建对象。

        3
  •  2
  •   John K    15 年前

    Anonymous Types ,C=3。

    这是相当动态的风格,因为您不必为获取自定义对象而编写类模板。

    // An anonymous object with two properties: obj.Name and obj.Age
    var obj = new { Name = "Joe", Age = 35  };
    

    编译器将根据您提供的初始化值推断属性的类型。

    无法从源代码访问该类型,但可以在IL中看到。但是,如果您创建多个具有相同属性的匿名对象,C编译器将对所有对象使用相同的类型。

    // All objects use the same anonymous type
    var obj1 = new { Name = "Joe", Age = 1  };
    var obj2 = new { Name = "Art", Age = 30  };
    var obj3 = new { Name = "Sally", Age = 25  };
    
    // A different (second) anonymous type
    var objDifferent = new { Phone = "555-555-1212", Name = "Joe", Age = 1  };
    

    规定 还有很多,但这些很重要。

    • var只能用于方法范围(作为局部变量),而不能用于类范围。
    • 匿名对象具有只读属性;不能将数据重新分配给它们。
        4
  •  2
  •   John K    15 年前

    激活(也适用于远程对象)

    使用 System.Activator 类“重载” Activator.CreateInstance 方法。这进入了在本地创建对象的领域,或者 远程地 .

    using System;
    
    /* Create instances of a Random number generator (or any class)
     *  without using the 'new' operator.
     */
    Random rand1 = Activator.CreateInstance<Random>();
    Random rand2 = (Random)Activator.CreateInstance(typeof(Random));
    //etc...
    

    ( MSDN Documentation about Remote Objects. )

        5
  •  1
  •   Logan Capaldo    15 年前

    假设您谈论的是动态对象的创建:

    很明显你需要一个图书馆来支持这个,除非你想进入 Reflection.Emit 您自己-Linfu在版本1中支持此功能:

    http://code.google.com/p/linfu/

    但是,这是一个在我记得的版本2之前就被删除的特性。