如何在窗体中设置标签,其中要标记的文本框的数量是动态的(取决于之前的用户输入)?
我现在在做什么
这样就可以很好地创建文本框,但是我无法通过它们进行标记。
注意:numStates
是一个由用户以前一种形式输入的int。
更新:我已经隔离了这段代码并在VS 2010中进行了测试,并且标签工作正常,但在我的最终版本中却没有。 (见背景。)
背景:这用于Enterprise Architect(EA)的加载项。我正在通过.msi安装程序部署加载项并测试EA中的最终安装,并且标签不起作用。 我现在猜测在EA加载项创建的表单中有一些不兼容的标签?
System.Windows.Forms.TextBox[] textBoxes = new System.Windows.Forms.TextBox[numStates];
for (int index = 0; index < textBoxes.Length; index++)
{
textBoxes[index] = new System.Windows.Forms.TextBox();
textBoxes[index].Location = new System.Drawing.Point(126, yLocation);
textBoxes[index].Name = "stateName" + index;
textBoxes[index].Size = new System.Drawing.Size(161, 20);
textBoxes[index].TabStop = true;
textBoxes[index].TabIndex = index;
this.Controls.Add(textBoxes[index]);
textBoxes[0].Focus();
yLocation += 25;
}
我看过的内容
How to detect tab key pressing in C#?
Adding Event Handler for Dynamically Created to window Form
答案 0 :(得分:1)
这似乎在Visual Studio 2013中运行良好。不确定您使用的是哪个版本。我建议删除AcceptsTab。这通常意味着(至少对于RichTextBoxes),控件将截取选项卡并插入一系列空格,而不是跳转到下一个制表位。请参阅以下代码:
注意我添加了:this.Controls.Add(textBoxes [index]); (不确定您是否已经在解决此问题)
int numStates = 5;
int yLocation = 0;
System.Windows.Forms.TextBox[] textBoxes = new System.Windows.Forms.TextBox[numStates];
for (int index = 0; index < textBoxes.Length; index++)
{
textBoxes[index] = new System.Windows.Forms.TextBox();
textBoxes[index].Location = new System.Drawing.Point(126, yLocation);
textBoxes[index].Name = "stateName" + index;
textBoxes[index].Size = new System.Drawing.Size(161, 20);
textBoxes[index].TabStop = true;
textBoxes[index].TabIndex = index;
this.Controls.Add(textBoxes[index]);
textBoxes[0].Focus();
yLocation += 25;
}
还想指出,虽然TextBox控件上有一个LostFocus事件,可以像下面这样使用:
textBoxes[index].LostFocus += Form1_LostFocus;
如此处理:
void Form1_LostFocus(object sender, EventArgs e)
{
MessageBox.Show("Lost Focus From: " + ((Control)sender).Name);
}
答案 1 :(得分:1)
以下将是一个黑客,但它应该工作:
private int numStates = 5;
private void Form1_Load(object sender, EventArgs e)
{
int yLocation = 0;
System.Windows.Forms.TextBox[] textBoxes = new System.Windows.Forms.TextBox[numStates];
for (int index = 0; index < textBoxes.Length; index++)
{
textBoxes[index] = new System.Windows.Forms.TextBox();
textBoxes[index].Location = new System.Drawing.Point(126, yLocation);
textBoxes[index].Name = "stateName" + index;
textBoxes[index].Size = new System.Drawing.Size(161, 20);
textBoxes[index].AcceptsTab = true;
textBoxes[index].TabStop = false;
textBoxes[index].TabIndex = index;
textBoxes[index].KeyPress += Form1_KeyPress; //Added line
this.Controls.Add(textBoxes[index]);
textBoxes[0].Focus();
yLocation += 25;
}
}
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if(e.KeyChar == '\t')
{
int currentState = int.Parse(((Control)sender).Name.Replace("stateName", ""));
if(currentState == numStates - 1)
{
this.Controls["stateName" + (0).ToString()].Focus();
}
else
{
this.Controls["stateName" + (currentState + 1).ToString()].Focus();
}
}
}
请注意,我将numStates移到外面以模仿它是用户输入。另外,我将TabStop设置为false,只是为了确保windows事件不会在不同的环境中触发,因为它现在由KeyPress事件处理。