我有一堆动态添加的控件,当用户单击添加用户按钮时逐行添加。我希望在页面加载时有一个标签,并且我希望每次单击添加用户按钮时(在每行文本框下)都会向下移动相同的标签。现在它正在加载,当用户第一次点击按钮时,它会向下移动,但在它刚刚停留之后。这里是我的代码:C#winforms dynimcally创建标签位置
全局变量:
Label Savelbl = new Label();
int LabelX = 15;
int LabelY = 110;
int spacelbl = 15;
页面加载:
Savelbl.Location = new Point(LabelX, LabelY);
Savelbl.Name = "Savelbl";
Savelbl.Text = "Please click 'save' to save your changes";
CaeUsersPanel.Controls.Add(Savelbl);
添加用户按钮:
private void CAEAddUserbtn_Click(object sender, EventArgs e)
{
var i = UsernameTextBoxes.Count + 1; // this is a list of the added textboxes
ADDUserInfo(i); //method which adds the dynamically created textboxes
Savelbl.Location = new Point(LabelX, LabelY + spacelbl);
}
删除用户按钮(标签应移回当点击时):
private void Remove_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Are you sure you want delete this user? \n Deleting users may break workflows", "Delete", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
int idx = RemoveButtons.IndexOf((Button)sender);
// Remove button
RemoveButtons[idx].Dispose();
RemoveButtons.RemoveAt(idx);
// Remove textbox
UsernameTextBoxes[idx + 1].Dispose();
UsernameTextBoxes.RemoveAt(idx + 1);
//Shift controls up
for (int i = idx; i < RemoveButtons.Count; i++)
{
UsernameTextBoxes[i + 1].Top -= SpaceDelta;
}
space -= SpaceDelta;
Savelbl.Location = new Point(LabelX, LabelY - spacelbl);
}
}
使用'TableLayoutPanel',只是添加或删除行。这是一个更好的方法。 – CodingYoshi
@CodingYoshi我可以把标签放在tablelayout面板中吗?还是我必须移动所有的控件? – GFDSRFV
只是动态控制。为每个控件创建一个列并设置行和列的高度和宽度(全部使用设计器)。然后只需添加或删除控件。创建一个虚拟表单并使用它来查看它是如何工作的。然后,一旦你知道它是如何工作的,以你的真实形式使用它。 – CodingYoshi