2009-12-08 2 views
2

안녕하세요, 저는이 성가신 문제가 있습니다. 값이있는 데이터 소스의 항목을 가져 오는 CheckBoxList가 있습니다. 필요한 것은 값이 "33"인 Item이 선택되었을 때 일부 패널을 표시하는 것입니다. 그래서 나는 Clicked Item, Last Clicked, 또는 뭔가를 얻을 필요가있다. 나는 많은 방법을 시도했으나 효과가 없을 것이다. 다음 3 줄 중 아무 것도 나를 구할 수 없다 :CheckBoxList의 항목을 클릭 할 때 무언가를 표시해야합니다.

protected void chkServicos_SelectedIndexChanged(object sender, EventArgs e) 
    { 
      // 
      // Just trying to get the "clicked" value 
      // 

      CheckBoxList cbl = sender as CheckBoxList; 
      Response.Write(cbl.SelectedIndex); 
      Response.Write(cbl.SelectedItem); 
      Response.Write(cbl.SelectedValue); 
    } 
+0

이 markup- 포함이 당신에게 절대적으로 긍정적 사용할 수 있습니다 (수동 마지막 상태를 저장하지 않고)의 SelectedIndexChanged 이벤트를 트리거 클릭 한 값을 얻으려면 * 값 *은 33로 설정됩니까? 이것은 아이템의 * 텍스트 *와는 다릅니다. –

답변

1

:

if (!Page.IsPostBack) 
    { 

     ViewState["Clicked"] = false; 
    } 

는 SelectedChanged :

CheckBoxList clicked = (CheckBoxList)sender; 
    bool selected = clicked.Items.FindByValue("33").Selected; 

    if (selected) 
    { 
     if (Convert.ToBoolean(ViewState["Clicked"]) == false) 
     { 
      //do something 
      ViewState["Clicked"] = true; 
     } 
    } 
    else 
    { 
     ViewState["Clicked"] = false; 
    } 
+0

입니다 그것을 완료 한 간단한 마술! 감사 –

0

이 시도 :

cbl.SelectedItem.Checked that should return true/false 
cbl.SelectedItem.Text that should return the actual string 
cbl.SelectedValue.Text that should return the value bound 
+0

cbl.SelectedItem는 값을 반환합니다, 그래서 심지어 –

+0

다시 한번 감사 ".checked를"검증이없는, 그러나 그것은 나에게 그냥 클릭 ... 나는 다른 항목이있는 경우, .SelectedItem을 선택한 항목을 제공하지 않습니다 그리고 SelectedValue가 엉망이 될 것입니다. –

0

시도의 하드 코딩 :이 문자열-cbl.SelectedValue 동일해야

<asp:ListItem value="33">This Item</asp:ListItem>

을"33". 작동하는 경우 데이터 바인딩을 업데이트하여 listitem의 값이 올바른 데이터 멤버에 바인딩되도록합니다.

2

잘못된 것이 있습니다. 대부분의 경우 33을 .SelectedValue 값으로 가정합니다. 목록에 여러 항목이있는 경우 SelectedValue는 처음 선택된 항목 만 표시합니다. 이 코드의 작동 방식은 다음과 같습니다.

<form id="form1" runat="server"> 
    <asp:CheckBoxList ID="CheckBoxList1" runat="server" 
     onselectedindexchanged="CheckBoxList1_SelectedIndexChanged"> 
     <asp:ListItem Value="33">33</asp:ListItem> 
     <asp:ListItem Vaue="Not 33">Not 33</asp:ListItem> 
    </asp:CheckBoxList> 
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> 
    </form> 

    protected void CheckBoxList1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Response.Write((sender as CheckBoxList).SelectedValue); // prints 33 if 33 is selected 
    } 

물론 목록에서 여러 항목을 선택한 경우 결과가 예상 한 것과 다를 수 있습니다. 당신은 같은 것을 고려해 볼 수 있습니다 :

ListItem selected33 = CheckBoxList1.Items.Cast<ListItem>() 
    .Where(item => item.Value == "33" && item.Selected).SingleOrDefault(); 

    if (selected33 != null) 
    { 
     Response.Write("33 is selected"); 
    } 
+0

흠 .. 코드가 필요한 패널을 보여줄 수있었습니다 ..하지만 항목 33을 선택하고 다른 항목을 선택하면 패널이 반복해서 나타납니다. –

+0

그러면 필요한 것 같군요. 논리가 바뀔 때 패널을 숨기기 위해서! – RichardOD

1

당신이 선택한 항목과 모음 사이에 사랑하는 당신의 검사 값의 컬렉션을 저장 한 후 해당 이벤트가 발생할 때 수행해야 할 수도 있습니다. 그 checkboxList의 선택된 item과 value 프라퍼티는 항상 선택된 아이템의 콜렉션에있는 첫 번째 아이템을 리턴 할 것입니다.

0
CheckBoxList cbl = sender as CheckBoxList; 
ListItem item = cbl.Items.FindByValue("33"); 
if (item != null && item.Selected) 
{ 
    //Show Panel 
}   
+0

이 방법으로, 트리거의 SelectedIndexChanged, 내 항목이 선택된 다른 모든 시간의 판넬이 assynchronous 요청을 사용할 때 발생하는 그, 그래 –

1

난 정말 당신의 질문에서 말할 수는 없지만, 내 생각은 SelectedIndexChanged 이벤트가 당신의 방법에 의해 처리되기 전에 아마 체크 박스의 값을 재설정하고 있다는 점이다 (내가 그 전에했던!) .

해당 처리기를 호출하기 전에 ViewState에서 서버에서 페이지를 완전히 다시 작성해야하므로 Page_Load 및 메서드가 호출됩니다. 이러한 메소드 핸들러 중 하나에서 값을 목록에 바인딩하는 경우 목록 옵션을 덮어 쓰게되고 선택된 색인이 기본값으로 재설정됩니다. 또는 이러한 메소드 중 하나에서 기본 선택 인덱스를 설정할 수도 있습니다.일부 자바 스크립트에없는 경우

if (!Page.IsPostBack) { .. } 
+0

를 표시합니다 있습니다 .. CheckBoxList 내 부하 방법은 이미 내부 경우 (! Page.IsPostback) –

1

는,이 일할 수 :

ASPX

<div> 
     <asp:HiddenField ID="cblLastChecked" runat="server" Value="" /> 
     <asp:CheckBoxList ID="cbl" runat="server" AutoPostBack="true" > 
      <asp:ListItem Text="11" Value="11"></asp:ListItem> 
      <asp:ListItem Text="22" Value="22"></asp:ListItem> 
      <asp:ListItem Text="33" Value="33"></asp:ListItem> 
     </asp:CheckBoxList> 
    </div> 

<script language="javascript"> 
    function CheckBoxListClickHandler(sender) { 
     //the sender is the checkbox, but the value is in a label below 
     var label = sender.nextSibling; 
     var lastChecked = document.getElementById("cblLastChecked"); 
     if(label != null && lastChecked != null) 
     { 
      lastChecked.value = label.innerText; 
     } 
     //alert(lastChecked.value); 
    } 
</script> 
당신은 같은 같은 경우에 데이터 소스를 바인딩 있는지 확인 문제가 발생하지 않도록하려면 페이지로드

CS

protected override void OnInit(EventArgs e) 
     { 
      base.OnInit(e); 

      foreach (ListItem item in this.cbl.Items) 
      { 
       item.Attributes.Add("onclick", "javascript:CheckBoxListClickHandler(this)"); 
      } 

      this.cbl.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged); 
     } 

     void list_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      string targetValue = "33"; 
      if (this.cblLastChecked.Value == targetValue) 
      { 
       ListItem item = this.cbl.Items.FindByValue(targetValue); 
       if (item != null && item.Selected) 
       { 
        //Show Panel 
       } 
       else 
       { 
        //hide panel 
       } 
      } 
     } 
0

당신은

protected void checkboxlist_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     CheckBoxList list = (CheckBoxList)sender; 
     string[] control = Request.Form.Get("__EVENTTARGET").Split('$'); 
     int idx = control.Length - 1; 
     string sel = list.Items[Int32.Parse(control[idx])].Value; 
} 
관련 문제