2014-02-26 21 views
1

我正在做一個簡單的程序來添加一個學生(帶ID,名稱)到一個列表,然後通過會話通過ID搜索學生。會話中沒有響應的C#列表元素

添加學生模塊就像下面,

protected void addStudent(object sender, EventArgs e) 
     { 
      List<Student> thisstdlist = new List<Student>(); 
      thisstdlist = (List<Student>)Session["stdlist"]; 
      thisstdlist.Add(new Student(txtsid.Text,txtsname.Text)); 
      Session["stdlist"] = thisstdlist; 
      Response.Redirect("Home.aspx"); 


     } 

搜索學生模塊是像下面,

protected void searchStudent(object sender, EventArgs e) 
     { 


      foreach (Student element in (List<Student>)Session["stdlist"]) 
      { 
       if(element.getID().Equals(txtstdid.Text)){ 
        txtstdname.Text = element.getName(); 
       } 
      } 
     } 

學生班級就像下面,

public class Student 
    { 
     private String Name; 
     private String ID; 

     public Student(String sid, String sn) { 

      this.Name = sn; 
      this.ID = sid; 

     } 

     public String getName() { 

      return this.Name; 
     } 
     public String getID() 
     { 

      return this.ID; 
     } 


    } 

但是當我添加了學生,例如100,約翰和搜索100,它給了我沒有結果。請任何人都可以告訴我這樣做的錯誤或正確的方法。

+3

爲什麼你正在使用的方法,讓您的字段值?你可以使用自動實現的屬性,這不是Java。 –

+0

我該怎麼辦?請指導我 –

回答

3

add Student模塊將不會正確初始化學生列表 - 您正在創建新的List<Student>,然後將新列表與下一行分配一起丟棄。我會喜歡的東西去:

var thisstdlist = (List<Student>)Session["stdlist"]; 
// If a key isn't found in Session, it will be null .. 
if (thisstdlist == null) 
{ 
    // i.e. only re-initialize if it was missing from session 
    thisstdlist = new List<Student>(); 
    // You don't need to continually reassign the session variable 
    Session["stdlist"] = thisstdlist; 
} 
// Adds to the list; now that Session also has a reference to the same list 
thisstdlist.Add(new Student(txtsid.Text,txtsname.Text)); 

按照註釋,注意,C#有自動(儘管是可變的)屬性 - 你不需要的Java風格的getter和setter。

public class Student 
{ 
    public Student(string sid, string sn) 
    { 
     Name = sn; 
     ID = sid; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 
    public string ID 
    { 
     get; 
     set; 
    } 
} 

而且,在.NET中,==字符串is overridden測試值(與字符串Java的引用相等),所以你可以重寫比較爲:

if (element.ID == txtstdid.Text) 
{ 
    txtstdname.Text = element.Name; 
} 

回覆:foreach - 我猜意味着您正在使用ListDictionary(HashMap)時尚 - 如果您使用Dictionary而不是List - 這將允許您刪除foreach,轉而使用:

// addStudent ... 
var txtstdname = new Dictionary<string, Student>(); 
// ... 
txtstdname.Add(txtsid.Text, new Student(txtsid.Text,txtsname.Text)) 

// searchStudent ... 
Student element = null; 
if (txtstdname.TryGetValue(out element)) 
{ 
    txtstdname.Text = element.Name(); 
} 
4

您是否正在設置斷點並實際檢查這些列表的值以及實際存儲在會話中的值?

.Equals()沒有做什麼你認爲它是

嘗試:

foreach (Student element in (List<Student>)Session["stdlist"]) 
      { 
       if(element.ID == txtstdid.Text){ 
        txtstdname.Text = element.getName(); 
       } 
      } 
+0

你不能直接調用element.ID,因爲它是私人的,所以我使用element.getID(),但仍然沒有結果:( –

+0

對不起,我錯過了,然後公開它,如果你有一個公共職能或者...直接調用GetID()== –

+0

+1。Java風格'.Equals' [仍然可以](http://stackoverflow.com/questions/814878/c-sharp-difference-between儘管在.Net中顯然不是常見的約定,但在Java中卻是必需的。 – StuartLC