从其他c#方法访问动态创建的控件

本文关键字:创建 控件 动态 访问 其他 方法 | 更新日期: 2023-09-27 18:07:14

我试图通过点击按钮访问我动态创建的Textbox

private void assortiment_Load(object sender, EventArgs e)
{
    string lastorder = "Select MAX(idorders) From orders";

    string query = "Select * From Product";
    var cmd = new MySqlCommand(lastorder, connection);
    cmd.CommandType = CommandType.Text;
    int orderid = Convert.ToInt32(cmd.ExecuteScalar());
    label1lblorderid.Text = orderid.ToString();
    var cmd2 = new MySqlCommand(query, connection);
    var da = new MySqlDataAdapter(cmd2);
    var ds = new DataSet();
    da.Fill(ds, "Image");
    int count = ds.Tables["Image"].Rows.Count;
    var y = 3;
    for (int i = 0; i < count; i++)
    {
        var data = (Byte[])(ds.Tables["Image"].Rows[i]["Image"]);
        var stream = new MemoryStream(data);
        //picture box creation
        var pbList = new PictureBox
        {
            Name = "pic" + i,
            Size = new Size(150, 150),
            SizeMode = PictureBoxSizeMode.StretchImage,
            Image = Image.FromStream(stream)
        };
        //panel creation
        var tblPanelList = new TableLayoutPanel
        {
            Name = "tblp" + i,
            Size = new Size(380, 150),
            Location = new System.Drawing.Point(219, y),
            BackColor = Color.ForestGreen,
            GrowStyle = TableLayoutPanelGrowStyle.AddColumns,
            ColumnCount = 2
        };
        //other
        productid = Convert.ToInt32((ds.Tables["Image"]
                               .Rows[i]["idproduct"]).ToString());
        //Textbox: Aantal
        var tbAantal = new TextBox { Size = new Size(107, 20), 
                                         Name = "tbaantal" + productid};
        //label productid
        var lblproductid = new Label();
        lblproductid.Text = productid.ToString();
        //Button: Bestellen
        var btnBestel = new Button();
        btnBestel.Name = "bestel" + productid;
        btnBestel.Text = "Bestellen";
        btnBestel.Anchor = AnchorStyles.Right;
        btnBestel.Click += btnBestel_Click;
        //Voeg controls toe
        this.panel.Controls.Add(pbList);
        this.Controls.Add(tblPanelList);
        tblPanelList.Controls.Add(naam);
        tblPanelList.Controls.Add(omschrijving);
        tblPanelList.Controls.Add(lblAantal);
        tblPanelList.Controls.Add(tbAantal);
        tblPanelList.Controls.Add(btnBestel,1,10);
        tblPanelList.Controls.Add(lblproductid);
        y = y + 156;
    }        
}
void btnBestel_Click(object sender, EventArgs e)
{
    MainForm frm_1 = new MainForm();
    var button = sender as Button;
    string btnname = button.Name.ToString();
    //btnname.Remove(1, 6);
    int orderid = Convert.ToInt32(label1lblorderid.Text);
    Control tbAantalControl = FindControl("tbAantal" + btnname.Remove(0, 6));
    int aantal = Convert.ToInt32(tbAantalControl.Text);
    //MessageBox.Show(btnname.Remove(0,6));
    string query = "Insert Into orderproduct(idorder, idproduct, aantal) 
                     Values('" + orderid + "'" + productid +
                     "'" + aantal + "')";
    var cmd = new MySqlCommand(query, connection);
    cmd.ExecuteNonQuery();
}

正如您所看到的,我已经尝试通过FindControl()访问Textbox,但这不起作用。我想要的Textbox具有相同的最后值点击TextBox,我试图做到这一点,通过剪切字符串和粘贴在一个变量。

请帮。

从其他c#方法访问动态创建的控件

首先,您正在搜索与您创建它们的名称不同的TextBox es (tbAantal... vs. tbaantal...)。与递归Find方法一起,工作。

这既不是好的做法,也不是快。


与其每次创建控件时都按名称搜索控件,不如直接实现让您检索控件(通过一些标识符或类似的,在您的情况下:通过productid)。

例如:

Dictionary<int, TextBox> textBoxes声明为局部变量。在循环中,在tbAantal的定义之后添加textBoxes.Add(productid, tbAantal);

btnBestel_Click中,您可以使用此映射通过textBoxes[productid]检索正确的TextBox。我知道你并没有真正在那个上下文中定义productid

您应该使用ButtonsTag属性,而不是使用btnname.Remove(0, 6),并将productid作为额外的元数据存储:

回到循环中,在适当的位置添加btnBestel.Tag = productid;。在btnBestel_Click中,你可以写textBoxes[(int)button.Tag] .

总的代码

Dictionary<int, TextBox> textBoxes = new Dictionary<int,TextBox>();
private void assortiment_Load(object sender, EventArgs e)
{
    string lastorder = "Select MAX(idorders) From orders";

    string query = "Select * From Product";
    var cmd = new MySqlCommand(lastorder, connection);
    cmd.CommandType = CommandType.Text;
    int orderid = Convert.ToInt32(cmd.ExecuteScalar());
    label1lblorderid.Text = orderid.ToString();
    var cmd2 = new MySqlCommand(query, connection);
    var da = new MySqlDataAdapter(cmd2);
    var ds = new DataSet();
    da.Fill(ds, "Image");
    int count = ds.Tables["Image"].Rows.Count;
    var y = 3;
    for (int i = 0; i < count; i++)
    {
        var data = (Byte[])(ds.Tables["Image"].Rows[i]["Image"]);
        var stream = new MemoryStream(data);
        //picture box creation
        var pbList = new PictureBox
        {
            Name = "pic" + i,
            Size = new Size(150, 150),
            SizeMode = PictureBoxSizeMode.StretchImage,
            Image = Image.FromStream(stream)
        };
        //panel creation
        var tblPanelList = new TableLayoutPanel
        {
            Name = "tblp" + i,
            Size = new Size(380, 150),
            Location = new System.Drawing.Point(219, y),
            BackColor = Color.ForestGreen,
            GrowStyle = TableLayoutPanelGrowStyle.AddColumns,
            ColumnCount = 2
        };
        //other
        productid = Convert.ToInt32((ds.Tables["Image"]
                                .Rows[i]["idproduct"]).ToString());
        //Textbox: Aantal
        var tbAantal = new TextBox { Size = new Size(107, 20), 
                                            Name = "tbaantal" + productid};
        textBoxes.Add(productid, tbAantal);
        //label productid
        var lblproductid = new Label();
        lblproductid.Text = productid.ToString();
        //Button: Bestellen
        var btnBestel = new Button();
        btnBestel.Name = "bestel" + productid;
        btnBestel.Text = "Bestellen";
        btnBestel.Anchor = AnchorStyles.Right;
        btnBestel.Click += btnBestel_Click;
        btnBestel.Tag = productid;
        //Voeg controls toe
        this.panel.Controls.Add(pbList);
        this.Controls.Add(tblPanelList);
        tblPanelList.Controls.Add(naam);
        tblPanelList.Controls.Add(omschrijving);
        tblPanelList.Controls.Add(lblAantal);
        tblPanelList.Controls.Add(tbAantal);
        tblPanelList.Controls.Add(btnBestel,1,10);
        tblPanelList.Controls.Add(lblproductid);
        y = y + 156;
    }        
}
void btnBestel_Click(object sender, EventArgs e)
{
    MainForm frm_1 = new MainForm();
    var button = sender as Button;
    int orderid = Convert.ToInt32(label1lblorderid.Text);
    Control tbAantalControl = textBoxes[(int)button.Tag];
    int aantal = Convert.ToInt32(tbAantalControl.Text);
    string query = "Insert Into orderproduct(idorder, idproduct, aantal) 
                        Values('" + orderid + "'" + productid +
                        "'" + aantal + "')";
    var cmd = new MySqlCommand(query, connection);
    cmd.ExecuteNonQuery();
}

我不确定您是否为搜索提供了有效的控件名称。对于检查,您应该在行上应用断点,以查看您是否获得有效的控件名称。

要按名称搜索所需的控件,应该递归地查看每个父控件。FindControl方法可用于此目的。

改变:

Control tbAantalControl = FindControl("tbAantal" + btnname.Remove(0, 6));
与这个:

Control tbAantalControl = FindControl(this.Controls, "tbAantal" + btnname.Remove(0, 6));

递归找到所需的方法:

 private Control FindControl(Control.ControlCollection controlCollection, string name)
    {
        foreach (Control control in controlCollection)
        {
            if (control.Name.ToLower() == name.ToLower())
            {
                return control;
            }
            if (control.Controls.Count > 0)
            {
                Control result = FindControl(control.Controls, name);
                if (result != null)
                {
                    return result;
                }
            }
        }
        return null;
    }

是否有任何原因,你不能只是使tbAantal的形式级别变量,然后在btnBestel_Click方法中引用?

var tbAantal = null;
private void assortiment_Load(object sender, EventArgs e)
    {
        string lastorder = "Select MAX(idorders) From orders";

        string query = "Select * From Product";
        var cmd = new MySqlCommand(lastorder, connection);
        cmd.CommandType = CommandType.Text;
        int orderid = Convert.ToInt32(cmd.ExecuteScalar());
        label1lblorderid.Text = orderid.ToString();
        var cmd2 = new MySqlCommand(query, connection);
        var da = new MySqlDataAdapter(cmd2);
        var ds = new DataSet();
        da.Fill(ds, "Image");
        int count = ds.Tables["Image"].Rows.Count;
        var y = 3;
        for (int i = 0; i < count; i++)
        {
            var data = (Byte[])(ds.Tables["Image"].Rows[i]["Image"]);
            var stream = new MemoryStream(data);
            //picture box creation
            var pbList = new PictureBox
            {
                Name = "pic" + i,
                Size = new Size(150, 150),
                SizeMode = PictureBoxSizeMode.StretchImage,
                Image = Image.FromStream(stream)
            };
            //panel creation
            var tblPanelList = new TableLayoutPanel
            {
                Name = "tblp" + i,
                Size = new Size(380, 150),
                Location = new System.Drawing.Point(219, y),
                BackColor = Color.ForestGreen,
                GrowStyle = TableLayoutPanelGrowStyle.AddColumns,
                ColumnCount = 2
            };
            //other
            productid = Convert.ToInt32((ds.Tables["Image"].Rows[i]["idproduct"]).ToString());
            //Textbox: Aantal
            tbAantal = new TextBox { Size = new Size(107, 20), Name = "tbaantal" + productid};

            //label productid
            var lblproductid = new Label();
             lblproductid.Text = productid.ToString();

             //Button: Bestellen
             var btnBestel = new Button();
             btnBestel.Name = "bestel" + productid;
             btnBestel.Text = "Bestellen";
             btnBestel.Anchor = AnchorStyles.Right;
             btnBestel.Click += btnBestel_Click;
            //Voeg controls toe
            this.panel.Controls.Add(pbList);
            this.Controls.Add(tblPanelList);
            tblPanelList.Controls.Add(naam);
            tblPanelList.Controls.Add(omschrijving);
            tblPanelList.Controls.Add(lblAantal);
            tblPanelList.Controls.Add(tbAantal);
            tblPanelList.Controls.Add(btnBestel,1,10);
            tblPanelList.Controls.Add(lblproductid);

            y = y + 156;
        }
    }
    void btnBestel_Click(object sender, EventArgs e)
    {
        MainForm frm_1 = new MainForm();
        var button = sender as Button;
        string btnname = button.Name.ToString();
        //btnname.Remove(1, 6);
        int orderid = Convert.ToInt32(label1lblorderid.Text);
        int aantal = Convert.ToInt32(tbAantal.Text);
        //MessageBox.Show(btnname.Remove(0,6));
        string query = "Insert Into orderproduct(idorder, idproduct, aantal) Values('" + orderid + "'" + productid +
                       "'" + aantal + "')";
        var cmd = new MySqlCommand(query, connection);
        cmd.ExecuteNonQuery();
    }