2011-04-23 41 views
0

嗨我有以下代碼,我在其中調用函數名爲ControlAdd但編譯器調試代碼,直到此功能,但而不是此功能。下面是代碼:函數不調用

void SettingControls() 
    { 
     for (int i = 0; i < listBox1.Items.Count; i++) 
     { 
      string[] ListText; 
      ListText = listBox1.Items[i].ToString().Split('.'); 
      if (ListText[0] == ";Control") 
      { 
       if (ListText[1] == "Form") 
       { 
        this.Text = OrganizeData(listBox1.Items[i + 2].ToString().Trim()); 
        this.Width = Convert.ToInt16(OrganizeData(listBox1.Items[i + 3].ToString())); 
        this.Height = Convert.ToInt16(OrganizeData(listBox1.Items[i + 4].ToString())); 
        this.Left = Convert.ToInt16(OrganizeData(listBox1.Items[i + 5].ToString())); 
        this.Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 6].ToString())); 
       } 
       else 
       { 
        string Control_Text; 
        string Control_Name; 
        int Control_Width, Control_Height, Control_Left, Control_Top; 
        Control_Name = OrganizeData(listBox1.Items[i + 2].ToString().Trim()); 
        Control_Text = OrganizeData(listBox1.Items[i + 3].ToString().Trim()); 
        Control_Width = Convert.ToInt16(OrganizeData(listBox1.Items[i + 4].ToString())); 
        Control_Height = Convert.ToInt16(OrganizeData(listBox1.Items[i + 5].ToString())); 
        Control_Left = Convert.ToInt16(OrganizeData(listBox1.Items[i + 6].ToString())); 
        Control_Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 7].ToString())); 
        ControlAdd(ListText[1].ToString(), Control_Name, Control_Text, Control_Width, Control_Height, Control_Left, Control_Top); 
       } 
      } 
     } 
    } 

這不是由編譯器調用函數是:

ControlAdd(ListText[1].ToString(), Control_Name, Control_Text, Control_Width, Control_Height, Control_Left, Control_Top); 

編譯調試代碼,直到這條線:

Control_Top = Convert.ToInt16(OrganizeData(listBox1.Items[i + 7].ToString())); 

它只是跳過線。我使用了斷點,但是節目停止了。編譯器跳過這一行但沒有發生異常。 這個程序工作正常,直到我添加一個新的參數ControlName到函數控件添加。發生此問題後,添加參數。我也嘗試刪除我添加的參數,但問題仍然存在。

+1

之後會發生什麼?你說它沒有被調用 - 發生了什麼*我的猜測是上一行發生異常,但很難知道...... – 2011-04-23 10:50:50

+0

當你說「調試代碼直到這一行」時,你是什麼意思?執行是否停止併產生異常?該程序是否跳過該行?如果你在那一行設置了一個斷點,程序永遠不會中斷? – 2011-04-23 10:51:01

+0

Project + Properties,Build選項卡,將平臺目標更改爲x86。這樣可以避免在64位操作系統上出現一個錯誤,在這個系統中,任何由窗體的Load事件調用的代碼都會在沒有診斷的情況下吞下異常。 – 2011-04-23 14:18:35

回答

1

我認爲你正在使用try/catch錯誤處理。這就是爲什麼你的debuger不顯示任何異常,因爲可能你的catch塊是空的。

3

您正在循環:

for (int i = 0; i < listBox1.Items.Count; i++) 

但您要訪問數組的該元素:

listBox1.Items[i + 7] 

有一個非常好的機會,這已經超出了數組的末尾,從而導致要提出的例外。

您需要更改循環的結束條件,以便i+7是有效的數組索引。

0

也許您的項目巫婆調試器的輸出文件夾正在尋找組件不同於調試程序集。

當執行程序集(在調試模式下)不同於最新的輸出程序集時,會發生此問題。您可以嘗試在代碼中添加斷點,並查看斷點是否在調試模式下有效且可訪問。

+0

如果您在Visual Studio中運行項目(即使用附加的調試器),它將*重建*自上次構建以來發生更改的任何項目。我看不出這是一個問題。 – 2011-04-23 10:59:13

+0

我在很多情況下都遇到過這個問題。特別是當我更改輸出文件夾。 – 2011-04-23 11:02:31

+0

如果更改輸出文件夾,調試器也會在那裏查找程序集。 – 2011-04-23 11:04:24

0

我相信你的問題源於你重複使用listBox1中的物品。第一次循環時,您正在尋找listBox1.Items[0]listBox1.Items[6]listBox1.Items[7],但在第二個循環中,您正在尋找listBox1.Items[1]listBox1.Items[7]listBox1.Items[8]。我想你想要更像這樣的東西:

void SettingControls() 
{ 
    for (int i = 0; i < listBox1.Items.Count; i++) 
    { 
     string[] ListText; 
     ListText = listBox1.Items[i].ToString().Split('.'); 
     if (ListText[0] == ";Control") 
     { 
      if (ListText[1] == "Form") 
      { 
       ... 
       i+=6; 
      } 
      else 
      { 
       ... 
       i+=7; 
      } 
     } 
    } 
}