【问题标题】:How to retrieve data from dynamically created user control in C#如何从 C# 中动态创建的用户控件中检索数据
【发布时间】:2019-12-01 13:29:39
【问题描述】:

我有一个包含文本框和日期选择器的用户控件。当表单加载时,动态生成用户控件并在表单中显示。 (EventComponent(用户控件))。

我想在用户单击保存按钮时获取这些用户控件值中的每一个。

public partial class InsertEventForm : Form
{
    private int numberOfEvent;

    public InsertEventForm(int numberOfEvent)
    {
        InitializeComponent();
        this.numberOfEvent = numberOfEvent;
    }

    private void InsertEventForm_Load(object sender, EventArgs e)
    {
        EventComponent[] eventComponents = new EventComponent[(int)this.numberOfEvent];
        int i = 0;

        Button backBTN = new Button();
        backBTN.Text = "Back";
        backBTN.Location = new Point(0, 10);
        backBTN.Size = new Size(50, 30);
        this.Controls.Add(backBTN);

    // generate user control dynamically here

        for ( i = 0; i < eventComponents.Length; i++)
        {
            eventComponents[i] = new EventComponent();
            System.Drawing.Point pLabel = new System.Drawing.Point(36, 50 + i * 280);
            eventComponents[i].Location = pLabel;
            eventComponents[i].Size = new System.Drawing.Size(358, 259);
            this.Controls.Add(eventComponents[i]);
        }

        Button saveBTN = new Button();
        saveBTN.Text = "Save";
        saveBTN.Location = new Point(200, 50 + i * 280);
        saveBTN.Size = new Size(100, 50);
        this.Controls.Add(saveBTN);
        saveBTN.MouseEnter += new System.EventHandler(this.SaveBTN_click);
    }

    private void SaveBTN_click(object sender, EventArgs e)
    {
        // need to retrieve value from user control
    }
}

【问题讨论】:

  • 问题在于您声明控件的位置。您在方法中声明了控件,因此您无法引用其他方法中的控件。因此,在全局空间中声明 backBTN,例如: Button backBTN;然后在 InsertEventForm_Load 方法中分配按钮: backBTN = new Button();
  • 让你 eventComponents 和 saveBtn 控件的字段或属性,你可以在任何你想要的地方访问它。
  • 我想知道你在用户控件中设置值的位置。

标签: c# winforms user-controls


【解决方案1】:

选项 1

创建List&lt;EventComponent&gt; EventComponentList

当您添加到this.Controls 时添加到列表中

this.Controls.Add(eventComponents[i]);
EventComponentList.Add(eventComponents[i]);

选项 2(不推荐)

private void SaveBTN_click(object sender, EventArgs e)
{
    var list = this.Controls.OfType<EventComponent>().ToList();
}

【讨论】:

    【解决方案2】:

    如果您切换到 MVVM,则必须创建模型 Event,并且每个字段都将是该类的参数,稍后您将创建 ObservableCollection,每次您都将使用 Event 类型的对象填充单击save 按钮创建对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      相关资源
      最近更新 更多