2010-09-22 77 views
2

我想從一個動態綁定的複選框列表控件中選擇的項目返回一個字符串沒有運氣。我希望有人能幫忙。在我的代碼背後,我正在向一個叫做用戶的類建立一個數據表。然後,我的數據表綁定到cblist中控制如何從asp.net中的checkboxlist控件返回選定的項目

 private void populateUserList() //called on page load 
    { 

      SubmitOptions mySubmission = new SubmitOptions(juris, rptType, tmplName); 

      if (mySubmission.Users.Count == 0) 
      { 
       lbl_juris.Visible = false; 
       cb_selectUser.Visible = false; 
       lbl_AlertMsg.Visible = true; 
       btnSelect.Visible = false; 
       lbl_AlertMsg.Text = "No supervisors listed for jursidiction: " + juris.ToString(); 
      } 
      else 
      { 

       dt.Columns.Add("Users"); 
       for (int i = 0; i < mySubmission.Users.Count(); i++) 
       { 
        DataRow dr = dt.NewRow(); 
        dr["Users"] = mySubmission.Users[i]; 
        dt.Rows.Add(dr); 
       } 

       cb_selectUser.DataSource = dt; 
       cb_selectUser.DataBind(); 
      } 

    } 

在主aspx文件我已經控制定義爲:

<asp:CheckBoxList ID="cb_selectUser" 
     Width="400px" 
     Height="100%" 
     AutoPostBack="false" 
     runat="server" 
     CellPadding="2" 
     CellSpacing="5" 
     DataTextField="Users" 
     DataValueField="Users" 
     > 
     </asp:CheckBoxList> 

我曾嘗試下面的代碼,我在列表itterate但這隻有當我將值作爲列表項硬編碼到Checkboxt列表中時才起作用。

protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e) 
    { 
     for (int i = 0; i < cb_selectUser.Items.Count; i++) 
     { 
      if (cb_selectUser.Items[i].Selected) 
      { 

       selectedUsers += cb_selectUser.Items[i].Text; 
      } 
     } 

列表填充罰款和所有我想要做的就是在一個字符串從複選框列表控件中的所有選定的用戶的回報。

正如我所說,如果我硬編碼的項目值到控制上述代碼的作品,我可以看到字符串中選定的項目,但刪除itemslist標籤和切換到綁定nothign發生。上述方法計算返回的全部數量,但沒有選擇任何返回。

關於我缺少的任何提示或建議將不勝感激。

回答

9

這裏是完全按照您的需要完成頁面的完整代碼。只需添加一個CheckboxList以將其命名爲list1,將其添加到btn並添加一個標籤並將其命名爲lbl。

protected void Page_Load(object sender, EventArgs e) 
     { 
      if(!IsPostBack) 
      { 
       var dt = new DataTable(); 
       dt.Columns.Add("Users"); 

       const string str = "User {0}"; 
       for(var i=1;i<=10;i++) 
       { 
        //var r = dt.NewRow(); 
        //r.ItemArray=new object[]{string.Format(str,i)}; 
        dt.Rows.Add(new object[] {string.Format(str, i)}); 
       } 
       list1.DataSource = dt; 
       list1.DataTextField = "Users"; 
       list1.DataBind(); 
      } 
     } 

     protected void btn_Click(object sender, EventArgs e) 
     { 
      var s = list1.Items.Cast<ListItem>() 
        .Where(item => item.Selected) 
        .Aggregate("", (current, item) => current + (item.Text + ", ")); 
      lbl.Text = s.TrimEnd(new[] {',', ' '}); 
     } 
+0

當測試這個我時,整個列表都是在列表中返回的。在你的例子中,你返回llist中的10個項目,但是如果只選擇了一個複選框項目,那麼字符串仍然會顯示全部10個項目。 – rlcrews 2010-09-22 16:38:05

+0

對不起@randyc。我用'Where'子句更新了'Linq'表達式以僅獲取選定的項目。 – TheVillageIdiot 2010-09-22 16:43:11

+0

非常感謝。我的Linq充其量是虛弱的,同時瞭解你在做什麼,我不確定在哪裏做出改變。再次感謝你的幫助。這是一個非常有效的解決方案。 – rlcrews 2010-09-22 16:57:47

0

您可以使用發件人檢索您選擇的項目並查看您是否得到相同的結果?

protected void btn_returnUserList(object sender, System.Web.UI.ImageClickEventArgs e) 
{ 
    CheckBoxList cbl = sender as CheckBoxList; 
    if (sender == null) { 
     throw new Exception("Sender is not a CheckBoxList"); 
    } 

    for (int i = 0; i < cbl.Items.Count; i++) 
    { 
     if (cbl.Items[i].Selected) 
     { 
      // Also, set a breakpoint here... are you hitting this line? 
      selectedUsers += cbl.Items[i].Text; 
     } 
    } 

此外,測試,看看你是否進入選定的項目塊...他們註冊爲選定的,但沒有得到文本回來?或者這些項目沒有顯示在第一位?

+0

詹姆斯,我測試了這一點,它是運行在破發點,但是我覺得有東西在被動態創建項目的方式。當我測試它時,它會繼續返回一個空值。 – rlcrews 2010-09-22 16:59:08

2

你確定populateUserList()只被調用一次嗎? (即不在回發中)。如果它被調用兩次,所選項目集合將爲空白。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
    populateUserList(); 
    } 
} 
+0

感謝Adam,是的,我正在測試頁面加載以及方法本身的回傳。該方法只被調用一次。 – rlcrews 2010-09-22 17:00:15

0

您需要確保您的複選框列表中有數據綁定,然後嘗試從中檢索值。

0

試試這個: -

foreach (ListItem li in cb_selectUser.Items) 

    { 
     //Your Code 
    } 
2

1下載Jquery.json.js並將其添加到您的視圖refrence:

<script src="../../Scripts/jquery.json.js" type="text/javascript"></script> 
2- I've added a ".cssMyClass" to all checkboxlist items so I grab the values by their css class: 


<script type="text/javascript" > 
     $(document).ready(function() { 
      $("#btnSubmit").click(sendValues); 
     }); 

     function populateValues() 
     { 
      var data = new Array(); 
      $('.myCssClas').each(function() { 
       if ($(this).attr('checked')) { 
        var x = $(this).attr("value"); 
        data.push(x); 
       } 
      }); 

      return data; 
     } 

     function sendValues() { 
      var data = populateValues(); 
        $.ajax({ 
         type: 'POST', 
         url: '@Url.Content("~/Home/Save")', 
         data: $.json.encode(data), 
         dataType: 'json', 
         contentType: 'application/json; charset=utf-8', 
         success: function() { alert("1"); } 
        }); 

      } 



    </script> 

3-正如你所看到的我已經將所有選定的值添加到數組中,並且我通過ajax將它傳遞給「Home」控制器的「Save」動作。4 - 在Controller中,您可以通過添加數組作爲參數來接收值:

[HttpPost] 
     public ActionResult Save(int[] val) 
     { 

我搜索了太多,但顯然這是唯一的解決方案。如果您找到更好的解決方案,請讓我知道。

2
string skills=""; 
    for(int i=0;i<chkboxlist.Items.Count;i++) 
    { 
     if(chkboxlist.Items[i].Selected) 
     { 
      skills=skills+chkboxlist.Items[i].Text+","; 
     } 
    } 
    skills = skills.Remove(skills.Length-1); 
    lblResult.Text = skills.ToString(); 
-2

我有同樣的問題。你必須綁定CheckBoxList如下:

if(!IsPostBack) 
{ 
    //Bind your checkboxlist 
} 
相關問題