為什么遍歷的程序中會出現索引超出陣列的界限問題呢?有沒有人幫忙看一下


uj5u.com熱心網友回復:
你debug看一下coltxtSpend應該是空陣列,索引0沒有任何物件,所以會報錯uj5u.com熱心網友回復:
不對,就算改變coltxtSpeed里面的值也不對。
uj5u.com熱心網友回復:
你陣列是空的,改變值當然不對,你確定你表單上有1000個textbox控制元件?而且還都是textbox1,textbox2,...textbox1000? 如果沒有1000個這樣的控制元件,那Controls.Find回傳值就是空的,因為他沒找到控制元件,明白了么???uj5u.com熱心網友回復:
沒有那么多
,我只是測驗一下而已,有74個,那按照這樣的話是沒有找到嗎?可是我里面確實有74個textBox,而且還是按順序的。
uj5u.com熱心網友回復:
這74個能找到,但再繼續回圈就會報錯uj5u.com熱心網友回復:
你應該使用while,而不是for,沒有1000個只有74,所以找75時coltxtSpend是空的,取第1個當然會提示超出索引或者你加個判斷coltxtSpend長度,只有長度大于0才執行下方的代碼
uj5u.com熱心網友回復:
判斷find后是否為空 ,并以此為條件回圈推薦使用while 當為空后 回圈結束
uj5u.com熱心網友回復:
那我還有什么辦法可以改進嗎?用while的話,我怎么判斷這form里面有沒有我的那個文本框?
uj5u.com熱心網友回復:
我還是有點不懂,我定的長度不是就只有74個嗎?為什么會找到75個?uj5u.com熱心網友回復:
噢,我好像有點明白了,我試一下。
uj5u.com熱心網友回復:
你都for 1000了,何止75
bool flag=true;
int i=1;
while(flag)
{
//找textbox+i
//如果有,做你想要的處理
//如果沒有,設定flag=false,不再繼續找
}
uj5u.com熱心網友回復:
你這樣做維護很麻煩的啊,如果有人改動了textbox命名,你都不知道改動哪一個了,要調試很久uj5u.com熱心網友回復:
還是不行,在進行控制元件轉換時還是報了那個錯誤
就是這一句TextBox textBox=coltxtSpeed[0] as TextBox
uj5u.com熱心網友回復:
你這樣做維護很麻煩的啊,如果有人改動了textbox命名,你都不知道改動哪一個了,要調試很久
那有什么簡便的方法嗎,就是時間框選擇了時間之后再出現時間
uj5u.com熱心網友回復:
這種非特定數量,名稱無法嚴格確認的場景用foreach好一點。當然,回到你的代碼,用不到回圈,也可能是我沒有完全理解你的需求。假定你為每個DateTimePicker創建了對應的TextBox,希望在每個DateTimePicker選擇了時間以后,把時間賦給對應 的TextBox。
正確的做法是:每個DateTimePicker在變化時只需操作自己對應的那個TextBox,而非任意一個DateTimePicker發生變化以后,讀取所有的DateTimePicker然后更新所有的TextBox。
在這種情況下,需要告訴DateTimePicker,它所對應 的TextBox是哪一個,方法很多,比如把TextBox的名字存到DateTimePicker的Tag里,或者讓它們保持相同的命名規則,DateTimePicker叫 dtp0, dtp1, dtp2……(或者dtpA, dtpB, dtpC, ……),對應的TextBox叫txt0, txt1, txt2……(或者叫txtA, txtB, txtC……)
重點是:人為嚴格設定二者的變數名,或者Tag屬性,完全可以確保不出錯。
重點是:人為嚴格設定二者的變數名,或者Tag屬性,完全可以確保不出錯。
重點是:人為嚴格設定二者的變數名,或者Tag屬性,完全可以確保不出錯。
private void DateTimePicker_ValueChanged(object sender, EventArgs e)
{
DateTimePicker dtp = sender as DateTimePicker;
//如果因為設定錯誤,這句話有可能會找到一個null結果,但是這種錯誤是完全可以避免的,所以就不加入null判斷了
TextBox textBox = Controls.Find(dtp.Tag.ToString(), true).OfType<TextBox>().First();
//如果無法完全避免找不到TextBox的情況(這種情況真的不可能發生),可以改成
//TextBox textBox = Controls.Find(dtp.Tag.ToString(), true).FirstOrDefault() as TextBox;
//if(textBox is null)
//{
// DoSomeThing();
//}
textBox.Text = dtp.Value.ToString("yyyy-MM-dd HH:mm:ss.fff");
//如果不把textBox的名字存到Tag,而是采用相同的命名規則去進行關系對應,則用下面的方法去找TextBox
TextBox textBox2 = Controls.Find(dtp.Name.Replace("dtp", "txt"), true).OfType<TextBox>().First();
}
為所有DateTimePicker的ValueChanged事件系結這個方法即可,當然這個動作也可以用代碼完成。
public Form1()
{
InitializeComponent();
foreach (var dtp in Controls.OfType<DateTimePicker>())
{
dtp.ValueChanged += DateTimePicker_ValueChanged;
}
}
uj5u.com熱心網友回復:
更進一步,直接系結匿名方法。public Form1()
{
InitializeComponent();
foreach (var dtp in Controls.OfType<DateTimePicker>())
{
dtp.ValueChanged += (s, e) =>
{
DateTimePicker d = s as DateTimePicker;
//如果因為設定錯誤,這句話有可能會找到一個null結果,但是這種錯誤是完全可以避免的,所以就不加入null判斷了
TextBox textBox = Controls.Find(dtp.Tag.ToString(), true).OfType<TextBox>().First();
//如果無法完全避免找不到TextBox的情況(這種情況真的不可能發生),可以改成
//TextBox textBox = Controls.Find(dtp.Tag.ToString(), true).FirstOrDefault() as TextBox;
//if(textBox is null)
//{
// DoSomeThing();
//}
textBox.Text = d.Value.ToString("yyyy-MM-dd HH:mm:ss.fff");
//如果不把textBox的名字存到Tag,而是采用相同的命名規則去進行關系對應,則用下面的方法去找TextBox
TextBox textBox2 = Controls.Find(dtp.Name.Replace("dtp", "txt"), true).OfType<TextBox>().First();
};
}
}
uj5u.com熱心網友回復:
隨著i的增加,找不到相應名稱的控制元件,所以報錯了。uj5u.com熱心網友回復:
好的,明天我試一下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/253726.html
標籤:C#
上一篇:Bytes相加
