如何将与每个字母关联的数字传递到主文本框中的不同文本框

时间:2014-09-08 23:07:23

标签: c# string winforms visual-studio-2010 visual-studio

我创建了一个winform应用程序,它从文本框中获取值并传递给不同的文本框。 但就我而言,我能够传递价值观。当我删除其中的一些字母时,我无法将每个数字准确传递到指定的文本框。

我有10个文本框来接收值。我有一个主要的文本框(即)textbox11来写入值并将它们传递给其他10个文本框。

让我说我在textbox11中键入N14 G73 X315.2 Y83.7 I40.0 J6.4 A0.0 H3 K75 T11 F5 M0 C0.0。我可以成功传递

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

3 个答案:

答案 0 :(得分: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;              
    }
}       

}

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

更新:代码块可以进一步改进: 我们的想法是使用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);;
        }       
    }

答案 1 :(得分: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]会抛出异常。

抱歉,我不确定它应该如何运作。

答案 2 :(得分: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];