string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');
foreach (var part in ip2)
{
textBox3.Text = part[0].ToString();
textBox4.Text = part[1].ToString();
textBox5.Text = part[2].ToString();
textBox6.Text = part[3].ToString();
}
大家好,我的问题是textBox3里面只有1个,我希望它有123个 为了记录,ip = 123.456.789.101用于测试目的。
这是结果:
当它设置textBox6时它也会崩溃:索引超出了数组的范围。
答案 0 :(得分:3)
让我们手动追踪您的代码:
ip2
包含数组{"123", "456", "789", "101"}
。 foreach
循环中迭代数组,因此part
成为每个字符串"123"
,"456"
,"789"
,{{ 1}}反过来。 "101"
。所以在第一次循环中,
char
是part[0]
,'1'
是part[1]
,'2'
是part[2]
和'3'
超出了字符串的范围(length = 3)。请注意,您需要致电part[3]
也是一个很好的指标。
相反,你想要(没有ToString()
循环),
foreach
答案 1 :(得分:1)
你的逻辑错误。
foreach
循环的每次迭代都是整个字符串。因此,当您这样做时:
part[NUMBER_HERE]
..您正在访问该字符串的索引处的单个字符。
您获得的IndexOutOfBounds
错误是因为我上面所说的。如果访问长度为3(索引0,1和2)的字符串索引3处的字符,则它将超出范围。
你根本不想要一个循环。将您的代码更改为:
string[] parts = ip.Split('.');
textBox3.Text = parts[0].ToString();
textBox4.Text = parts[1].ToString();
textBox5.Text = parts[2].ToString();
textBox6.Text = parts[3].ToString();
现在你有一个正在索引的实际字符串数组..而不是一个字符串。
答案 2 :(得分:1)
删除foreach
循环。
此行创建一个数组,其中包含新插槽中的每个值。
string[] ip2 = ip.Split('.');
然而,这会在数组中获取每个单独的值并访问其第n个插槽。
foreach (var part in ip2){
textBox3.Text = part[0].ToString();
textBox4.Text = part[1].ToString();
textBox5.Text = part[2].ToString();
textBox6.Text = part[3].ToString();
}
它将使用给定位置上的字符(由索引确定)覆盖您的数据。最后一个条目为101
,这就是文本框中的最后一个值为1
,0
和1
的原因。
只需删除循环就可以了。
答案 3 :(得分:0)
这是因为你正在迭代分裂的第一个结果。数组ip2包含拆分的结果(即ip2 [0] =“123”)。但是你写part[0]
,因为part包含了拆分的第一个结果(无论如何在第一次迭代中),part [0]现在意味着“123”中的第一个字符,当然是“1”。这是你需要做的:
string ip = ini.IniReadValue("Settings", "ip");
string[] ip2 = ip.Split('.');
textBox3.Text = ip2[0].ToString();
textBox4.Text = ip2[1].ToString();
textBox5.Text = ip2[2].ToString();
textBox6.Text = ip2[3].ToString();
理想情况下,在将文本分配给文本框之前,您需要检查分割是否返回了足够的结果。