2011-10-24 96 views
0

我一直在爲這一天打破了我的頭腦。 但我只是沒有看到它。複選框列表中的C#asp.net複選框始終未選中

我有一個名爲的CheckBoxList這cblRounds是

<asp:CheckBoxList ID="cblRondes" runat="server"> 
</asp:CheckBoxList> 

另外需要注意的,是的EnableViewState設置爲true。

在背後說我的代碼,在Page_Load我填德名單如下:

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!IsPostBack) 
    { 
     dpPrintRounds.FieldValue = DateTime.Now.AddDays(1); 

    } 
    FillCheckBoxList(); 
} 

private void FillCheckBoxList() 
{ 
    tourCollectie = new LogisticsTourCollection(); 
    RelationCollection rc = new RelationCollection(LogisticsItemEntity.Relations.LogisticsItemSpecsEntityUsingSeqSpecs); 
    rc.Add(LogisticsItemSpecsEntity.Relations.LocationEntityUsingSeqLocationDelivery); 
    rc.Add(LocationEntity.Relations.LocationLogisticsTourEntityUsingSeqLocation); 
    rc.Add(LocationLogisticsTourEntity.Relations.LogisticsTourEntityUsingSeqLogisticsTour); 
    PredicateExpression pe = new PredicateExpression(LogisticsItemSpecsFields.RequiredDeliveryDate == dpPrintRounds.FieldValue); 
    pe.Add(LogisticsItemFields.DeliveryNumber != DBNull.Value); 
    tourCollectie.GetMulti(pe, rc); 

    cblRondes.Items.Clear(); 
    foreach (LogisticsTourEntity tour in tourCollectie) 
    { 
     cblRondes.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString())); 
    }   
} 

然後我點擊一個按鈕,我檢查複選框的checkstate

protected void btnPrintHeaders_Click(object sender, EventArgs e) 
{ 
    PrintRounds(); 
} 

private void PrintRounds() 
{ 
    if (dpPrintRounds.Date_Selected.HasValue) 
    {    
     Dictionary<string, string> rondes = new Dictionary<string, string>(); 
     foreach (ListItem item in cblRounds.Items) 
     { 
      if (item.Selected) 
      { 
       rondes.Add(item.Value, GetDeliveryNumberFromRonde(item.Value)); 
      } 
     }    


    } 
} 

一切正常,正確的除外if(item.Selected)總是返回false。

我也有

<td> 
      <rm:DatePicker ID="dpPrintRounds" runat="server" /> 
     </td> 
     <td> 
      <asp:Button ID="btnSearch" runat="server" Visible="true" 
       onclick="btnSearch_Click" /> 
      <%--<asp:Literal ID="litLogisticsRoundName" runat="server" />:--%> 
     </td> 

的日期選擇器返回我用它來篩選我收藏的日期。 所以當我按下搜索按鈕時,我的複選框列表中會出現「新」複選框。 這就是爲什麼我沒有Fillcheckboxlist裏面的if(!IsPostBack)否則我沒有在新的搜索上的複選框。

我一直在尋找這個答案,並嘗試了幾件事情,但似乎沒有工作。 任何想法表示讚賞。

回答

2

Page_Load事件代碼必須包裝在IsPostBack塊中。

if(!IsPostBack) 
{ 
    foreach (LogisticsTourEntity tour in tourCollection) 
    { 
     cblRounds.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString())); 
    } 
} 

演示:

標記

<form id="form1" runat="server"> 
    <asp:CheckBoxList 
      ID="cblRounds" 
      runat="server"> 
    </asp:CheckBoxList> 
    <asp:Button 
      ID="Button1" 
      runat="server" 
      Text="Button" onclick="Button1_Click" /> 

</form> 

代碼隱藏

protected void Page_Load(object sender, EventArgs e) 
{ 
if (!IsPostBack) 
{ 
    for (int i = 1; i <= 10; i++) 
    { 
     cblRounds.Items.Add(new ListItem("Text" + i ,i.ToString())); 
    } 
} 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
PrintRounds(); 
} 
private void PrintRounds() 
{ 
    Dictionary<string, string> rondes = new Dictionary<string, string>(); 
    foreach (ListItem item in cblRounds.Items) 
    { 
     if (item.Selected) 
     { 
      rondes.Add(item.Text , item.Value); 
      Response.Write("<br/> " + item.Text + " " + item.Value); 
     } 
    } 

} 
+0

我做了,但它不會改變虛假的回報。 – Robin

+0

我明白爲什麼這會起作用。但是如果我有一個動態地在複選框列表中選中複選框的按鈕會怎麼樣?我沒有預定義數量的複選框顯示在頁面上。我根據某個「集合」製作複選框,當我更改DatePicker字段並按下「搜索」按鈕時,此集合會發生變化。如果我對此不清楚,我很抱歉。 – Robin

+0

@Robin - Put FillCheckBoxList();在IsPostBack塊內,什麼是dpPrintRounds? – adatapost

0

你保證這不是由於鑄造列表項?它需要不應該,但值得一試...

for (int i = 0; i < cblRounds.Items.Count; i++) 
{ 
    if (cblRounds.Items[i].Selected) 
    //do your stuff 
} 

此外,如果你設置斷點的地方,你是提領該Selected值什麼是它的狀態呢?這可能是一個問題,在綁定數據/用戶事件被捕獲的頁面生命週期中的哪個點與您嘗試獲取選定值的位置?

+0

綁定發生在獲取選定的值之前。我已經在那裏提出了一個斷點。它說每一次item.Selecten都是錯誤的。 – Robin

0

您的方法調用FillCheckBoxList()在頁面加載時填充列表框,無論它是否是回發。

這意味着你要重寫回發到服務器的值,如您填寫的代碼始終執行此:

cblRondes.Items.Clear(); 
foreach (LogisticsTourEntity tour in tourCollectie) 
{ 
    cblRondes.Items.Add(new ListItem(tour.Name, tour.SeqLogisticsTour.ToString())); 
} 

您只想填充的CheckBoxList的項目,如果它不是一個回發(即只當頁面第一次加載時)。

當它是一個回發時,CheckBoxList的Items集合已經由回發本身從網頁的內容填充。您不必在回發時填充控件。

你只是想你的Page_Load更改爲:

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!IsPostBack) 
    { 
     dpPrintRounds.FieldValue = DateTime.Now.AddDays(1); 
     FillCheckBoxList(); 
    } 
} 
0

在回答原來的問題,下面一起來看看可以幫助別人: -

http://aspdotnetcodebook.blogspot.co.uk/2008/08/how-to-add-checkboxlist-dynamically.html

我已經成功地動態創建一個checkboxlist,用db中的值填充它,然後在更改數據庫後更新。

+1

鏈接到底是什麼意思?如果這個鏈接過時了會發生什麼? – Ivan

+0

@ivan - 這是一個很好的問題,但不想複製和粘貼整個博客代碼,除了複製別人的工作,它會填滿這個職位的三到四個屏幕。好點,但最好做什麼。 – FlashTrev