2011-11-03 131 views
1

代碼物業在JobQuote類:沒有被添加到泛型列表<string> Add方法

public class JobQuote 
{ 
// Properties 
private List<string> _jobfilenames; 
public List<string> JobFileNames 
{ 
    get 
    { 
     if (_jobfilenames != null) 
      return _jobfilenames; 
     else 
     { 
      _jobfilenames = new List<string>(); 
      return _jobfilenames; 
     } 
    } 

    set { _jobfilenames = value; } 
} 

代碼物業在用戶控制

public JobQuote quote 
{ 
    get 
    { 
     if (ViewState["Quote"] != null) 
      return (JobQuote)ViewState["Quote"]; 
     else 
     { 
      JobQuote newQuote = new JobQuote(); 
      return newQuote; 
     } 
    } 
    set { ViewState["Quote"] = value; } 
} 

代碼在用戶控件的try塊,其中字符串不是被添加到字符串的通用列表中:

try 
     { 
      string filename = System.IO.Path.GetFileName(FileUploader.FileName); 
      quote.JobFileNames.Add(filename); 
     }  

我在做什麼wr翁?

+0

是一個例外發生的? – BoltClock

+0

您是否嘗試過調試以查看發生了什麼? –

+0

不,在這裏顯示的代碼中沒有發生異常。然而,稍後會拋出一個,指出「序列不包含任何元素」。 – Darren

回答

5

您正在閱讀viewstate,但您從未分配。

public JobQuote quote 
{ 
    get 
    { 
     if (ViewState["Quote"] != null) 
      return (JobQuote)ViewState["Quote"]; 
     else 
     { 
      // you only construct a new instance but you dont assign it to the viewstate 
      JobQuote newQuote = new JobQuote(); 
      // add the following line to fix the problem 
      // ViewState["Quote"] = newQuote; 
      return newQuote; 
     }  
    } 

這意味着,下次你參考報價財產時,一個新的JobQuote實例將被創建,而不是返回

舊JobQuote實例

實現該清潔的方法是:

public JobQuote Quote 
{ 
    get 
    { 
     JobQuote result = ViewState["Quote"] as JobQuote; 
     if (result == null) 
     { 
      result = new JobQuote(); 
      ViewState["Quote"] = result; 
     } 

     return result; 
    } 
} 
+0

雖然沒有在setter中設置,但在getter中設置了查看狀態以引用 –

+0

謝謝您的回答。 – Darren

2

您每次都要返回一個新的JobQuote實例。試試這個:

public JobQuote quote 
{ 
    get 
    { 
     if (ViewState["Quote"] != null) 
      return (JobQuote)ViewState["Quote"]; 
     else 
     { 
      JobQuote newQuote = new JobQuote(); 
      ViewState["Quote"] = newQuote; 
      return newQuote; 
     } 
    } 
    set { ViewState["Quote"] = value; } 
} 

或:

public JobQuote quote 
{ 
    get 
    { 
     if (ViewState["Quote"] == null) 
      ViewState["Quote"] = new JobQuote(); 

     return (JobQuote)ViewState["Quote"]; 
    } 
    set { ViewState["Quote"] = value; } 
} 
+0

我更喜歡第二種方式,有兩個原因:1-更短,更整潔。 2-你得到只有一個回報,這通常是一個很好的習慣afaik。 – Tipx

+0

@Tipx是的。我也喜歡這種方式。更容易閱讀和理解國際海事組織。 –