【问题标题】:How to add same type of panel having same type of controls at runtime in c# windows form?如何在 c# windows 窗体中在运行时添加具有相同类型控件的相同类型面板?
【发布时间】:2013-04-28 08:29:53
【问题描述】:

我创建了一个名为“添加孩子”的表单。 在那种形式中,我删除了一个组合框,用户可以从中选择没有他/她拥有的孩子。 最初有一个面板包含一个文本框来获取孩子的名字,3 个组合框来获取孩子出生日期的日期和月份,还有一个用于孩子血型的框。 现在我想要的是当用户选择它的孩子数量时,同一个面板会在运行时添加一个在另一个之下,具体取决于所选的数字。

我知道要简单地添加一个我们这样编码的控件

 private void addchildbtn_Click(object sender, EventArgs e)
        {
            Button btn = new Button();

            this.Controls.Add(btn);
        }

以及如果我们必须添加一个包含相同元素的相同类型的面板,一个在另一个之下该怎么办。 我做了这个错误的编码

private void addchildbtn_Click(object sender, EventArgs e)
        {
            childpnl pnl = new childpnln();

            this.Controls.Add(pnl);
        }

我还想通过在运行时添加的控件将数据提交到数据库。 那么如何命名这些控件来做数据库的编码。 请帮忙

【问题讨论】:

  • 是的.....实际上我不知道该怎么做,因为我是初学者@Yatrix
  • 我在下面给了你一个答案,但如果你是初学者,你可能还没有完全理解。您必须对如何完成所有这些事情进行一些研究,但这是编程的一部分。你花了很多时间在谷歌上搜索。 =) 错误将出现在错误窗口中,您可以在 Visual Studio 的视图菜单中打开该窗口。您需要通过 Google 搜索您收到的错误信息,以便更好地了解问题所在。
  • childpnl 是您创建的用户控件吗?

标签: c# .net


【解决方案1】:
    public int childrenCount; //The number of children

    private void button1_Click(object sender, EventArgs e) { //Adds a child
        childrenCount++;
        Panel p = new Panel();
        p.Location = new Point(10, (childrenCount - 1) * 200);
        p.Width = 300;
        p.Height = 200;
        p.BorderStyle = BorderStyle.Fixed3D;
        TextBox tName = new TextBox(); //TextBox for the name
        tName.Location = new Point(200, 20);
        tName.Text = "name";
        MonthCalendar calendar = new MonthCalendar(); //Calendar to choose the birth date
        TextBox bloodGroup = new TextBox(); //TextBox for the blood group
        bloodGroup.Location = new Point(200, 50);
        bloodGroup.Text = "blood group";
        p.Controls.Add(tName);
        p.Controls.Add(calendar);
        p.Controls.Add(bloodGroup);
        this.Controls.Add(p);
    }

    private void button2_Click(object sender, EventArgs e) { //Checks the values
        string message = "";
        foreach(Control c in this.Controls) { //loop throught the elements of the form
            if (c.GetType() == typeof(Panel)) { //check if the control is a Panel
                //Get the values from the input fields and add it to the message string
                Panel p = (Panel)c;
                TextBox tName = (TextBox)(c.Controls[0]);
                MonthCalendar calendar = (MonthCalendar)(c.Controls[1]);
                TextBox bloodGroup = (TextBox)(c.Controls[2]);
                message += tName.Text + ":\n";
                message += "birth date: " + calendar.SelectionStart.ToShortDateString() + "\n";
                message += "blood group: " + bloodGroup.Text + "\n\n";
            }
        }
        //show the message string in a MessageBox
        MessageBox.Show(message);
    }

示例:

如果您添加一个叫 Jack、出生日期为 2013 年 4 月 28 日、血型为 A+ 的孩子,则结果如下:

杰克:

出生日期:28.4.2013

血型:A+

(注意,如果您有其他文化,日期字符串可能会改变)

【讨论】:

  • 谢谢你,亲爱的,非常感谢......它工作正常,唯一的问题是我试图解决自己的位置再次感谢你这么多
【解决方案2】:

以这种方式添加面板看起来是正确的。可能还有其他原因导致问题。没有错误,很难说。

至于第二部分,如果你想从你的控件向数据库提交数据,不要在代码里面处理数据库代码。创建一个数据访问层来处理您的数据库调用。

为您的用户控件提供您可以从中检索数据的公共属性,或者创建一个您可以从用户控件上的函数或属性传回的模型。然后应将此模型与您的数据访问层结合使用,以根据需要更新数据库。

让您的主窗体或主窗体的模型(或控制器类,如果您走那条路)协调从控件到 DAL 再到 Db 的数据管理。

【讨论】:

  • 能否请给我帮助代码来解决这个问题...请
  • 我还没有在这个添加的新表单中进行任何编码,因为我对此一无所知
  • 我刚才的建议完全是写太多代码。我会为你写你的程序,这不是这个网站的目的。这个网站不是教人们如何编程,而是帮助解决特定的代码问题。你需要学会自己编程。查看 .NET 教程,购买书籍并使用 MSDN。
  • 好的朋友,谢谢,但我不需要完整的程序,我只需要帮助代码在运行时添加具有相同控件的相同面板即可
  • 如果你创建了一个用户控件,你应该能够将它添加到控件集合中。 this.controls.add(new ucMyPanel());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多