2014-09-08 2 views
1

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

У меня есть 10 текстовых полей для получения значений. И у меня есть одно основное текстовое поле (т. Е.) Textbox11 для записи значений и передачи их в 10 текстовых полей.

Так что скажем, я печатаю N14 G73 X315.2 Y83.7 I40.0 J6.4 A0.0 H3 K75 T11 F5 M0 C0.0 в текстовом поле11. Я могу успешно передать значения из

N to textbox1 = 14 
G to textbox2 =73 
X to textbox3 = 315.2 
Y to textbox4 = 83.7 
I to textbox5 = 40.0 
J to textbox6 = 6.4 
H to textbox7 = 3 
K to textbox8 = 75 
F to textbox9 = 30 
T to textbox10 = 11 

Но когда я изменить формат N14 G73 X315.2 Y83.7 I40.0 A0.0 H3 K75 T11 F5 M0 C0.0 Так здесь, когда по сравнению с выше линии, мы можем видеть, J6.4 отсутствует в этом случае, мои ценности остались сдвинуты .. Ниже выходной я получаю ..

N to textbox1 = 14 
G to textbox2 =73 
X to textbox3 = 315.2 
Y to textbox4 = 83.7 
I to textbox5 = 40.0 
J to textbox6 = 0.0 
H to textbox7 = 0.0 
K to textbox8 = 3 
F to textbox9 = 75 
T to textbox10 = 30 

Как справиться с этой ситуацией .. Я хочу каждый номер каждого текстового поля независимо от длины строки.

Фрагмент кода:

private void textBox11_TextChanged(object sender, EventArgs e) 
    { 
     string originalText = textBox11.Text; 
     string[] splitString = originalText.Split(new Char[] { 'N', 'G', 'X', 'Y', 'I', 'J', 'A', 'H', 'K', 'F', 'T', 'M', 'C' }); 

     foreach (String str in splitString) 
     { 
      if(str == null || str.Length == 0) 
     { 
      switch (str[0]) 
      { 
       case 'N': 
        textBox1.Text = str.Substring(1); 
        break; 
       case 'G': 
        textBox2.Text = str.Substring(1); 
        break; 
       case 'X': 
        textBox3.Text = str.Substring(1); 
        break; 
       case 'Y': 
        textBox4.Text = str.Substring(1); 
        break; 
       case 'I': 
        textBox5.Text = str.Substring(1); 
        break; 
       case 'J': 
        textBox6.Text = str.Substring(1); 
        break; 
       case 'H': 
        textBox7.Text = str.Substring(1); 
        break; 
       case 'K': 
        textBox8.Text = str.Substring(1); 
        break; 
       case 'F': 
        textBox9.Text = str.Substring(1); 
        break; 
       case 'T': 
        textBox10.Text = str.Substring(1); 
        break; 
      } 
     } 
     } 
    } 
+0

Так что вы хотите предшествующий символ описывает, где это число идет? Итак, 'N14' должен помещать' 14' в 'textBox1' независимо от того, где он находится в строке? – Gutblender

+0

@Gutblender. Если это так, то в примере есть несогласованность с буквой F. 'F5' переводит на' F = 30' –

ответ

2

Обновление: Окончательный вариант: Для конкретного вопроса, его лучше использовать регулярное выражение. , Вот оптимизированный код:

private void textBox11_TextChanged(object sender, EventArgs e) 
    { 
     string originalText = textBox11.Text; 
     string[] splitString = originalText.Split(new Char[] { 'N', 'G', 'X', 'Y', 'I', 'J', 'A', 'H', 'K', 'F', 'T', 'M', 'C' }); 

     String charset = "NGXYIJHKFT"; 
     Regex regex = new Regex(@"[NGXYIJAHKTFMC]\d*\.?\d*"); 
     String str = ""; 

     foreach (Match match in regex.Matches(originalText)) 
     { 
      str = match.Value; 

      Control[] controls = Controls.Find("textBox" + (charset.IndexOf(str[0]) + 1), true); 

      if (controls.Length > 0) 
       ((TextBox)controls[0]).Text = str.Substring(1);     
     } 


    } 

====== Старых ответы ..

Лучше расщепленный на пространстве, а затем при установке в текстовые поля можно удалить первый символ. Причина делится на несколько символов, не может обеспечить порядок, по которому они будут поступать в выходной массив.

private void textBox11_TextChanged(object sender, EventArgs e) 
{ 
string originalText = textBox11.Text; 
    string[] splitString = originalText.Split(new Char[] { 'N', 'G', 'X', 'Y', 'I', 'J', 'A', 'H', 'K', 'F', 'T', 'M', 'C' }); 


foreach(String str in splitString) 
{ 
    if(str == null || str.Length == 0) 
     continue; 

    switch(str[0]) 
    { 
     case 'N': 
      textBox1.Text = str.Substring(1); 
      break; 
     case 'G': 
      textBox2.Text = str.Substring(1); 
      break; 
     case 'X': 
      textBox3.Text = str.Substring(1); 
      break; 
     case 'Y': 
      textBox4.Text = str.Substring(1); 
      break; 
     case 'I': 
      textBox5.Text = str.Substring(1); 
      break; 
     case 'J': 
      textBox6.Text = str.Substring(1); 
      break; 
     case 'H': 
      textBox7.Text = str.Substring(1); 
      break; 
     case 'K': 
      textBox8.Text = str.Substring(1); 
      break; 
     case 'F': 
      textBox9.Text = str.Substring(1); 
      break; 
     case 'T': 
      textBox10.Text = str.Substring(1); 
      break;    
    } 
}  

}

=========================

Update: Существует дальнейшее улучшение возможно с code block: Идея состоит в том, чтобы использовать Controls.Find, чтобы найти текстовое поле по имени. Вы должны сформировать кодовую точно по заказу, что вы хотите показать в текстовых окнах:

private void textBox11_TextChanged(object sender, EventArgs e) 
    { 
     string originalText = textBox11.Text; 
     string[] splitString = originalText.Split(new Char[] { ' ' }); 

     String charset = "NGXYIJAHKFTMC"; 

     foreach(String str in splitString) 
     { 
      ((TextBox)this.Controls.Find("textBox" + charset.IndexOf(str[0]), true)).Text = str.Substring(1);; 
     }  
    } 
+0

@ACUTALLY НЕТ НИКАКОГО ПРОСТРАНСТВА МЕЖДУ ХАРАКТЕРАМИ .. ИЗБЕГАЙТЕ О ЧЕМ 'N14G73X315.2Y83.7I40.0A0.0H3K75T11F5M0C0.0' – 2014-09-09 01:02:23

+1

Даже если нет места, он должен работать. Просто измените строку: string [] splitString = originalText.Split (новый Char [] {'N', 'G', 'X', 'Y', 'I', 'J', 'A', 'H ',' K ',' F ',' T ',' M ',' C '}); Заказ здесь не имеет значения – masum7

+0

Это было идеально. Когда я дал расстояние, это сработало .. скажите, как ввести 'N14G73X315.2Y83.7I40.0A0.0H3K75T11F5M0C0.0' .. вот так – 2014-09-09 01:06:37

0

первую очередь, я считаю, вы должны действительно научиться использовать отладчик.

Я не знаю, как вы можете получить результаты, которые вы получите в качестве первого индекса в массиве 0 не 1. Так splitString [1] никогда не может быть 14

вероятно Вы имеете что-то до начала N, возможно, вкладка или пробел.

После удаления J из строки результирующий массив становится меньше.

[14,73,315.2,83.7,40.0,0.0,3,75,11,5,0,0.0]

Если вы подсчитаете элементы, последний из них [11], поэтому splitString [12] выдает исключение.

Извините, я не уверен, как это должно работать вообще.

+0

ЭТО моя строка входит в текстовое поле ... 'N14G73X315.2Y83.7I40.0A0.0H3K75T11F5M0C0.0'. Так скажи мне, что я должен делать, пожалуйста !!! – 2014-09-09 01:03:44

0

Будет ли эта работа для вас ... Это действительно будет работать независимо от порядка, интервалов или любые между буквами вы снабжающих ... Добавить больше, если вам нужно ...

string yourLetters = "NGXYIJAHKTFMC"; 
string[] parts = new string[13]; 
string yourText = textBox11.Text; 
int p = -1; 
for (int i = 0; i < yourText.Length; i++) 
{ 
    if (yourLetters.Contains(yourText.Substring(i, 1))) 
    { 
     p++; 
     parts[p] = ""; 
    } 
    else 
     parts[p] += yourText.Substring(i, 1); 
} 

// Now, throw the parts into the textboxes 
textBox1.Text = parts[0]; 
textBox2.Text = parts[1]; 
textBox3.Text = parts[2]; 
textBox4.Text = parts[3]; 
textBox5.Text = parts[4]; 
textBox6.Text = parts[5]; 
textBox7.Text = parts[6]; 
textBox8.Text = parts[7]; 
textBox9.Text = parts[8]; 
textBox10.Text = parts[9]; 
Смежные вопросы