文本框选项卡在Enterprise Architect加载项中不起作用

时间:2014-11-19 16:59:25

标签: c# winforms visual-studio-2010 visual-studio enterprise-architect

如何在窗体中设置标签,其中要标记的文本框的数量是动态的(取决于之前的用户输入)?

我现在在做什么

这样就可以很好地创建文本框,但是我无法通过它们进行标记。 注意: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;
}

我看过的内容

c# windows form Tab Order

How to detect tab key pressing in C#?

  • 上述两个问题的答案影响了我现在正在做的事情。我 尝试以编程方式设置Tab键顺序。

Adding Event Handler for Dynamically Created to window Form

  • 我认为我不能这样做,因为没有“_CheckedChanged” 文本框,我只想在按Tab键时更改。

2 个答案:

答案 0 :(得分:1)

这似乎在Visual Studio 2013中运行良好。不确定您使用的是哪个版本。我建议删除AcceptsTab。这通常意味着(至少对于RichTextBoxes),控件将截取选项卡并插入一系列空格,而不是跳转到下一个制表位。请参阅以下代码:

  • 注意我拿出了一行:textBoxes [index] .AcceptsTab = true;
  • 注意我添加了: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事件处理。