1

Как настроить табуляцию в форме окна, где количество текстовых полей на вкладке динамическое (в зависимости от предыдущего ввода пользователя)?Текстовое поле Tabbing не работает в надстройке 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#?

  • Ответы на выше двух повлияло то, что я делаю сейчас. Я использую , чтобы попытаться установить порядок вкладок программно.

Adding Event Handler for Dynamically Created to window Form

  • Я не думаю, что я могу это сделать, потому что нет никакого «_CheckedChanged» для текстовых полей, и я только хочу, чтобы измениться, когда они давят вкладку.
+0

Если у вас есть динамическое количество текстовых полей - попробуйте использовать элемент управления DataGridView – Fabio

ответ

1

Это, похоже, отлично работает в Visual Studio 2013. Не знаете, какую версию вы используете. Я бы предложил удалить AcceptsTab. Это обычно означает (по крайней мере для RichTextBoxes), что элемент управления перехватит вкладку и вставляет серию пробелов вместо перехода на следующую вкладку. См. Код ниже:

  • Уведомление Я вынул строку: textBoxes [index] .AcceptsTab = true;
  • Уведомление: Я добавил: this.Controls.Добавить (Textboxes [индекс]); (Не уверен, что если вы уже это решение)

    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;     
        } 
    

хотел также отметить, что в то время как есть событие LostFocus на контроле TextBox, который может быть использован как следующее:

textBoxes[index].LostFocus += Form1_LostFocus; 

и обрабатываются таким образом:

void Form1_LostFocus(object sender, EventArgs e) 
    { 
     MessageBox.Show("Lost Focus From: " + ((Control)sender).Name); 
    } 
+0

Я вынул вкладку Accepts и обновил фрагмент кода в вопросе. Я добавлял контроль в другом месте. Я обновил свой вопрос тем, что я пробовал. Вы правы, это работало, когда я отлаживал именно эту форму, но все еще не работает в моей последней реализации. – Avantol13

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.

+0

Было ли это полезно? –

+0

Мне нравится этот хак, а в отладчике он работает, но не в финальной реализации. Я уверен, что проблема связана с тем, что EA не распознает нажатия клавиш в форме или перехватывает их, может быть? Понятия не имею. Я думаю, что это оставило проблемы Windows Forms. – Avantol13