繁体   English   中英

C#Winforms动态创建的按钮控件

[英]C# winforms dynamically created button controls

我有一个添加用户按钮,当用户单击它时,它会动态添加一个删除按钮和一个用户名文本框。 用户可以根据需要多次单击按钮,控件将继续添加。

我在动态创建删除按钮时遇到了麻烦。 它应该删除自身和旁边的用户名文本框。 相反,它将始终删除已添加的第一行。 同样,在单击“删除”后单击“添加新用户”时,它不会自动填充空白-它将新的文本框和按钮移到最底行。

这是我的代码:

private void AddUserbtn_Click_1(object sender, EventArgs e)
{
    TextBox[] Username = new TextBox[n];
    Button[] Remove = new Button[n];

    int UsernameX, UsernameY, RemoveX, RemoveY;

    UsernameX = 346;
    UsernameY = 45;
    RemoveX = 946;
    RemoveY = 45;

    for (int i = 0; i < n; i++)
    {
        Username[i] = new TextBox();
        Username[i].Size = new Size(233, 26);
        Username[i].Location = new Point(UsernameX, UsernameY + space);
        Username[i].Font = new Font("Arial", 10);
        Username[i].Name = "Username" ;

        Remove[i] = new Button();
        Remove[i].Location = new Point(RemoveX, RemoveY + space);
        Remove[i].Text = "Remove";
        Remove[i].Font = new Font("Arial", 10);
        Remove[i].Size = new Size(95, 23);
        Remove[i].UseVisualStyleBackColor = true;
        Remove[i].Click += new EventHandler(Remove_Click);
        Remove[i].Name = "Remove";

        space += 35;
    }

    for (int i = 0; i < n; i++)
    {
        CaeUsersPanel.Controls.Add(Username[i]);
        CaeUsersPanel.Controls.Add(Remove[i]);
    }
}

private void Remove_Click(object sender, EventArgs e)
{
    CaeUsersPanel.Controls.Remove(CaeUsersPanel.Controls[("Username")]);
    CaeUsersPanel.Controls.Remove(CaeUsersPanel.Controls[("Remove")]);
}

放置一个类变体来存储Button - TextBox对,并分别删除。 下面是经过快速测试的代码-并非针对内存泄漏/逻辑等进行微调,仅是满足您要求的示例代码。

Dictionary<Button, TextBox> pair = new Dictionary<Button, TextBox>(); // A dictionary to store the Button - TextBox pair

private void button1_Click(object sender, EventArgs e) {
    int n = 3; // Added for testing
    int space = 0; // Added for testing

    int UsernameX, UsernameY, RemoveX, RemoveY;

    UsernameX = 100; // Modified for testing
    UsernameY = 45;
    RemoveX = 400; // Modified for testing
    RemoveY = 45;

    for (int i = 0; i < n; i++) {
        var Username = new TextBox();
        Username.Size = new Size(233, 26);
        Username.Location = new Point(UsernameX, UsernameY + space);
        Username.Font = new Font("Arial", 10);
        Username.Name = "Username";

        var Remove = new Button();
        Remove.Location = new Point(RemoveX, RemoveY + space);
        Remove.Text = "Remove";
        Remove.Font = new Font("Arial", 10);
        Remove.Size = new Size(95, 23);
        Remove.UseVisualStyleBackColor = true;
        Remove.Click += new EventHandler(Remove_Click);
        Remove.Name = "Remove";

        Controls.Add(Username);
        Controls.Add(Remove);

        pair.Add(Remove, Username);

        space += 35;
    }
}
private void Remove_Click(object sender, EventArgs e) {
    Controls.Remove((Button)sender); // Removes the delete button
    Controls.Remove(pair[(Button)sender]); // Removes the textbox
    pair.Remove((Button)sender); // Removes the entry in dictionary
}

更新:另一个版本具有更好的内存和逻辑性。 如果OP希望,还可以将其余控件上移。

int n = 3; // Added for testing, probably you already have it somewhere
int space = 0; // Added for testing, probably you already have it somewhere

// Moved for logic
// Value modified for testing
int UsernameX = 100;
int UsernameY = 45;
int RemoveX = 400;
int RemoveY = 45;

int SpaceDelta = 35; // Added for logic

List<Button> RemoveButtons = new List<Button>();
List<TextBox> UsernameTextBoxes = new List<TextBox>();

private void button1_Click(object sender, EventArgs e) {

    Random rnd = new Random((int)DateTime.Now.Ticks); // Added for testing

    for (int i = 0; i < n; i++) {
        var Username = new TextBox();
        Username.Size = new Size(233, 26);
        Username.Location = new Point(UsernameX, UsernameY + space);
        Username.Font = new Font("Arial", 10);
        Username.Name = "Username";
        Username.Text = $"{(int)(rnd.NextDouble() * 100000)}"; // Added for testing

        var Remove = new Button();
        Remove.Location = new Point(RemoveX, RemoveY + space);
        Remove.Text = $"{(int)(rnd.NextDouble() * 100000)}";  // Modified for testing
        Remove.Font = new Font("Arial", 10);
        Remove.Size = new Size(95, 23);
        Remove.UseVisualStyleBackColor = true;
        Remove.Click += new EventHandler(Remove_Click);
        Remove.Name = "Remove";

        Controls.Add(Username);
        Controls.Add(Remove);

        RemoveButtons.Add(Remove);
        UsernameTextBoxes.Add(Username);

        space += SpaceDelta;
    }
}
private void Remove_Click(object sender, EventArgs e) {
    int idx = RemoveButtons.IndexOf((Button)sender);

    // Remove button
    RemoveButtons[idx].Dispose();
    RemoveButtons.RemoveAt(idx);

    // Remove textbox
    UsernameTextBoxes[idx].Dispose();
    UsernameTextBoxes.RemoveAt(idx);

    // Shift controls up
    for (int i = idx; i < RemoveButtons.Count; i ++) {
        RemoveButtons[i].Top -= SpaceDelta;
        UsernameTextBoxes[i].Top -= SpaceDelta;
    }

    space -= SpaceDelta;
}

删除最后创建的两个:

private void Remove_Click(object sender, EventArgs e)
{
    this.Controls.Remove(this.Controls[this.Controls.Count - 1]);
    this.Controls.Remove(this.Controls[this.Controls.Count - 1]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM