1

我创建了一个名为“添加孩子”的表单。在那种形式中,我删除了一个组合框,用户可以从中选择没有他/她拥有的孩子。最初有一个面板包含一个文本框来获取孩子的名字,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);
        }

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

4

2 回答 2

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+

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

于 2013-04-28T09:33:32.960 回答
0

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

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

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

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

于 2013-04-28T08:58:03.457 回答