2012-11-19 1 views
1

나는 목록보기를 가지고 있으며 사용자가 답변 할 수 있도록 몇 가지 질문을 바인딩하고 있습니다. 질문의 유형에 따라 , 다소 같은 등등 radiobuttonlist, 드롭 다운리스트, 텍스트 상자, 같은 다른 입력 컨트롤을 통해웹 양식에서 조건부로 장소 컨트롤을 지정하십시오.

대답 할 수 있습니다

<itemtemplate> 
    if (#eval("QuestionType") == 1) 
     { 
      <asp:RadioButtonList runat="Serer" /> 
     } 
    elseif(#eval("QuestionType") == 2) 
     { 
      <asp:DropDownList runat="Serer" /> 
     } 
    elseif(#eval("QuestionType") == 3) 
     { 
      <asp:CheckboxList runat="Serer" /> 
     } 
</itemtemplate> 

위가의 간단한 예를 들어 의사 코드 무엇인지 나는 실제로있다.

저는 실제로 제가 찾고있는 것을 이해하기를 바랍니다.

답변

1

당신은 당신의 ListViewOnItemDataBound 이벤트에 대한 이벤트 처리기를 추가해야합니다.

<asp:ListView ID="lstVw" runat="server" OnItemDataBound="lstVw_ItemDataBound"> 
    <ItemTemplate></ItemTemplate> 
</asp:ListView> 

그 시점부터 컨트롤을 행의 데이터 항목의 Controls 컬렉션에 동적으로 추가 할 수 있습니다.

protected void lstVw_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
     int val = int.Parse(e.Item.DataItem.ToString()); 

     switch (val) 
     { 
      case 1: 
       RadioButtonList list = new RadioButtonList(); 
       list.Items.Add("Option 1"); 
       list.Items.Add("Option 2"); 

       e.Item.Controls.Add(list); 

       break; 
      case 2: 
       // Add a dropdown list 
       break; 
      case 3: 
       // Add a checkbox list 
       break; 
      default: 
       // 
       break; 
     } 
    } 
} 

한 가지주의해야 할 - 나는 List<int>에 직접 내 ListView에 바인딩. 따라서 필요한 코드는 약간 다릅니다 - this을보십시오. 일반적인 생각은 ListView가 바인딩 된 형식으로 e.Item.DataItem을 캐스팅 한 다음 필요로하는 값을 얻는 것입니다.

포스트 백에 동적으로 추가 된 컨트롤의 값을 가져 오는 것은 (필요하다고 가정 할 때) 까다로울 수 있습니다. Page.FindControl()을 사용하여 페이지의 컨트롤을 반복하거나 ListView를 검사하고 DataRow에서 FindControl을 호출 할 수도 있습니다. 리플렉션을 사용하여 각 컨트롤의 유형을 찾아야 할 수도 있습니다. 내가 말했듯이, 그것은 간단하지 않을 것이지만 그것을 성취 할 수 있어야합니다.

2

조건부로 "배치"할 수는 없지만 조건부로 가시성을 설정할 수 있습니다.

<asp:RadioButtonList runat="server" 
    Visible='<%# (int)DataBinder.Eval(Container.DataItem("QuestionType")) == 1 %>' /> 
+0

"호출 할 수없는 멤버 'System.Web.UI.WebControls.ListViewItem.DataItem'은 메서드처럼 사용할 수 없습니다." –

+0

효과가있었습니다. 방금 DataBinder.Eval 대신 Eval을 사용했습니다 (Container.DataItem –

관련 문제