2012-07-09 92 views
0

在按鈕8單擊事件我所做的:爲什麼列表不更新,爲什麼var w始終爲空?

private void button8_Click(object sender, EventArgs e) 
     { 
      if (buttonLockMode == true) 
      { 
       trackBar1.Enabled = true; 
       button8.ForeColor = Color.Red; 
       button8.Enabled = false; 
       textBox1.Text = "Frame Number : " + trackBar1.Value; 
       this.trackBar1.Select(); 
       textBox3.Enabled = true; 
       textBox4.Enabled = true; 
       wireObjectAnimation1 = new WireObjectAnimation(this, wireObject1); 
       int currentFrameIndexRight = trackBar1.Value; 
       wireObjectCoordinates1 = new WireObjectCoordinates() { FrameNumber = currentFrameIndexRight }; 
       WireObjectCoordinatesCloneFrame(); 

       List<WireObjectCoordinates> temp = wireObjectAnimation1.CoordinatesList; 
       temp.Add(wireObjectCoordinates1); 
       //wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1); 

       //WireObjectCoordinatesCloneFrame(); 

      } 
      else 
      { 
       button8.ForeColor = Color.Black; 
      } 
     } 

Phoog我使用臨時表同樣的想法。 而在wireObjectanimation我所做的:

private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>(); 
     public List<WireObjectCoordinates> CoordinatesList 
     { 
      get { return _coordinateslist; } 
     } 

而且還當我把一個斷點的get線_coordinateslist和CoordinatesList兩空。

+8

這是很多要求某人審查的代碼。你能否將這個問題歸結爲核心問題? – 2012-07-09 16:43:43

+0

你的問題幾乎是不可讀的。也許你應該編輯它,讓它更清晰 – YavgenyP 2012-07-09 16:43:55

+0

你可以給一個SSCCE,簡短,自包含正確的例子嗎? – 2012-07-09 16:46:31

回答

1

First如果沒有元素滿足謂詞,則拋出。由此可見,_coordinatesList中很可能沒有FrameNumber等於currentFrameIndex的物品。

試試這個:將catch更改爲catch (Exception e),並且當執行進入catch塊時,使用調試器檢查異常。或者,將調試器設置爲處理異常,這也將使您有機會檢查異常。

一旦確定假設是否爲真,即序列中沒有元素滿足謂詞,則可以繼續下一步,即確定爲什麼沒有滿足條件的元素謂詞:要麼你的期望是錯誤的,要麼是應該滿足期望的代碼是錯誤的。

這是一個很好的例子,爲什麼你不應該在你的代碼中使用catch { }

如果你堅持使用代碼約定,這也會很有幫助。像_coordinatesList這樣的標識符通常是私人字段; WireObjectCoordinatesList通常是公共財產。你有它倒退,這是混亂。

關於列表吸氣斷點:

我把一個斷點的get,當我在按鈕8點擊它停在那裏但是現在的名單_coordinatesList是空的。如果我把斷點放在Form1的button8單擊事件上,我看到列表中包含的是點座標,但是當wireObjectanimation類中的IM列表爲空時。

考慮以下代碼:

private List<string> _words = new List<string>(); 
public List<string> Words { get { return _words; } } 

而這個調用代碼:

void AddAWord(string word) 
{ 
    this.Words.Add(word); 
} 

,調用代碼是相同的:

void AddAWord(string word) 
{ 
    List<string> temp = this.Words; 
    temp.Add(word); 
} 

換句話說,財產獲得者首先返回列表AddAWord,然後AddAWord在列表上調用Add。當你將斷點放在屬性獲取器中時,Thet很可能是列表中沒有包含任何東西的原因。

編輯

我不是這個意思表明,添加一個臨時變量將解決您的問題。而是,臨時變量旨在闡明問題發生的原因。添加temp變量不會改變代碼的含義。事實上,C#編譯器可能會隱式創建臨時變量。

也許我誤解了你所做的和你的期望,但對我來說,看起來你的期望是不正確的。換句話說,你已經把你的斷點放在了錯誤的路線上。

考慮:

1 private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>(); 
2 public List<WireObjectCoordinates> CoordinatesList 
3 { 
4  get { return _coordinateslist; } // <<< your breakpoint here 
5 } 
6 
7 private void button8_Click(object sender, EventArgs e) 
8 { 
9  if (buttonLockMode == true) 
10  { 
11   // ... 
12   List<WireObjectCoordinates> temp = wireObjectAnimation1.CoordinatesList; // <<< my breakpoint here 
13   temp.Add(wireObjectCoordinates1); 
14  } 
15  else 
16  { 
17   // ... 

現在通過代碼。你在第4行有一個斷點。我在第12行添加了一個斷點。我們首先命中第12行。打F11。執行移動到第4行,這是您的斷點。請注意,列表是空的。當然它是空的,因爲我們還沒有達到第13行。

點擊F11幾次,通過屬性獲得者。執行點返回到第12行。temp變量仍然爲空。再次按F11將屬性值分配給temp變量。執行移至第13行。

再次點擊F11。這稱爲Add方法。現在該列表包含一個元素。

我的觀點是,無論是否存在臨時變量,該指令序列都是相同的。考慮單行表達,像這樣:

wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1); 

下列步驟發生的,在此順序:

  • 通過wireObjectAnimation1
  • 調用CoordinatesList吸氣該對象
  • 上確定所引用的對象
  • 對上一步中由CoordinatesList吸氣劑返回的對象調用Add方法

您的斷點正在進行第二步;在第三步中調用Add;因此,當您點擊斷點時,該列表爲空。

+0

Phoog我將編輯我的問題,並縮短它,並告訴你我做了什麼,並改變仍然無法正常工作。 – user1477444 2012-07-09 18:36:59

+0

@ user1477444對不起,響應緩慢;這周我一直很忙。我編輯了我的答案以解決您編輯的問題。 – phoog 2012-07-11 19:49:40