我创建了一个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;
}
}
}
}
答案 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];