2011-01-12 4 views
0

나는이 같은 데이터베이스에서 질문에 소요 DataList에 ItemTemplate을 내에서 .aspx 페이지에서 다음과 같은 클라이언트 측 코드 :클라이언트 측 HTML 라디오 버튼을 동적 ID가있는 asp.net 웹 컨트롤로 변환합니다. (ASP.net) (VB)

<Itemtemplate> 
<b> <%=GetQuestionNum()%>) 
      <%#Server.HtmlEncode(Eval("Text").ToString())%></b> 
      <br /> 
      <asp:Panel ID="A" runat="server" Visible='<%#GetVisible(Eval("OptionA").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="A"> 
       <%#Server.HtmlEncode(Eval("OptionA").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="B" runat="server" Visible='<%#GetVisible(Eval("OptionB").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="B"> 
       <%#Server.HtmlEncode(Eval("OptionB").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="C" runat="server" Visible='<%#GetVisible(Eval("OptionC").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="C"> 
       <%#Server.HtmlEncode(Eval("OptionC").ToString())%> 
       </option><br /> 
      </asp:Panel> 
      <asp:Panel ID="D" runat="server" Visible='<%#GetVisible(Eval("OptionD").Tostring())%>'> 
       <input name="Q<%#Eval("ID")%>" type="radio" value="D"> 
       <%#Server.HtmlEncode(Eval("OptionD").ToString())%> 
       </option><br /> 
      </asp:Panel></itemtemplate> 

출력은 같은 것입니다 :

1) 귀하의 연령대는 무엇입니까?
- 옵션 1
- 옵션 2
- 옵션 3
- 옵션 4

라디오 버튼의 ID 년대는 ("Q"& QuestionID) 동적이다. 질문에 대한 응답이 없으면 GetVisible 함수는 false를 반환하고 포함 패널은 숨겨집니다.

나는 html을 없애고 asp : radiobuttons로 바꾸려고 노력해 왔지만 id를 databinding ..에서 간단히 설정할 수는 없다. 내가 좋아하는 뭔가를 시도했다 : 여기

<asp:RadioButton ID="Q<%#Eval("ID")%>" runat="server" Visible='<%#GetVisible(Eval("OptionA").Tostring())%>' 
       Text='<%#Server.HtmlEncode(Eval("OptionA").ToString())%>' /> 

가 제공하는 기능입니다 데이터 :

Public Shared Function GetQuestionsForSurvey(ByVal id As Integer) As DataSet 
    Dim dsQuestions As DataSet = New DataSet() 
    Try 
     Using mConnection As New SqlConnection(Config.ConnectionString) 
      Dim mCommand As SqlCommand = New SqlCommand("sprocQuestionSelectList", mConnection) 
      mCommand.CommandType = CommandType.StoredProcedure 
      Dim myDataAdapter As SqlDataAdapter = New SqlDataAdapter() 
      myDataAdapter.SelectCommand = mCommand 
      mCommand.CommandType = CommandType.StoredProcedure 
      mCommand.Parameters.AddWithValue("@id", id) 
      myDataAdapter.Fill(dsQuestions) 
      mConnection.Close() 
      Return dsQuestions 
     End Using 
    Catch ex As Exception 
     Throw 
    End Try 
End Function 

하지만 난 그게 불가능 즉, HTML 컨트롤을 작동 코드 숨김에서 자신의는 .text 값을 얻기 위해 찾는거야 , 또는 이벤트 추가!

전문가는 HTML을 적절한 asp.net 웹 컨트롤이나 코드 숨김으로 바꾸고 출력하는 더 좋은 방법을 제안 할 수 있습니까? 아니면 올바른 방향으로 나를 가르쳐 주시겠습니까?

감사합니다 : 0)

답변

1

나는 ASP 약간의 경험이 결합 데이터를 제어했다. 현재 직면 한 문제는 일 것입니다. 마크 업을 통해 컨트롤을 선언하면 데이터 바인딩에서 액세스 할 수 없습니다. 또한 서버 측 ID와 클라이언트 측 ID를 혼동하지 마십시오.

컨트롤의 Id 속성에 매핑 된 서버 쪽 ID는 프로그래밍 방식으로 코드 숨김에서 컨트롤에 액세스하는 데 사용됩니다. 클라이언트 측 ID는 태그의 id 속성에 배치되고 ClientId 속성에 매핑되는 ID입니다.

귀하의 질문에서 판단 할 때, 당신이 필요로하는 것은 다중 선택 설문 조사를 작성하는 것입니다. 제 의견으로는 ID가 어떻게 생성되는지는 중요하지 않습니다. 각 질문마다 올바르게 그룹화된다는 것입니다.

질문의 일부인 프로그래밍 방식으로 데이터 바인딩의 컨트롤에 액세스하는 부분에 답해 드리겠습니다.

다음은 내 코드의 예입니다. 당신이 데이터 바인딩시 데이터 세트를 받아 일부 특성에 따라 이미지를 설정이

<asp:GridView ID="example" runat="server" OnRowDataBound="DataBound"> 
    <Columns> 
     <asp:TemplateField HeaderText="New"> 
      <ItemTemplate> 
       <asp:Image ID="imgExample" runat="server" /> 
      </ItemTemplate> 
    </Columns> 
</asp:GridView> 

같은 매우 간단한의 GridView 있다고 가정합시다. DataList와 동일하게 작동하므로 걱정하지 마십시오.

이제 코드 숨김에서 RowDataBoundEvent을 처리합니다.imgExample 개체는 ItemTemplate의 하위 개체이기 때문에 직접 액세스 할 수 없습니다. 행이 결합 될 때, 당신은 행에 직접 액세스 한 다음 Control 클래스 다음

FindControl 방법을 사용할 수 있습니다 C# 코드 예제에서는 (VB로 변환하기 쉬운)

protected void DataBound(object sender, GridViewRowEventArgs e) 
{ 
     if (e.Row.RowType == DataControlRowType.DataRow) //Required 
     { 
      GridViewRow row = e.Row; 

      [...] //get an email message 

      (row.Cells[0].FindControl("imgExample") as Image).ImageUrl = (email.AlreadyRead) 
                      ? "Mail_Small.png" 
                      : "Mail_New_Small.png"; 
     } 
} 

응용 프로그램 당신의 case

객관식 설문 조사를 작성하려면 질문 (외부 컨트롤)을 포함 할 DataList를 만든 다음 각 행에 대해 답변이있는 RadioButtonList (내부 컨트롤)를 선언하는 것이 좋습니다. 외부 데이터 목록을 질의 응답의 데이터 세트에 바인드하십시오. RowDataBound 이벤트 또는 DataList 환경에서 호출 된 이벤트를 처리합니다. 해당 이벤트를 처리 할 때 내부 라디오 버튼 목록을 응답에 바인딩하십시오.

그것은 당신

+0

대단한 도움이었습니다. 감사합니다. – Phil

1

내가 실제로 순간에 비슷한 작업을하고 작동해야한다. 동적으로 내 페이지에 컨트롤을 추가하려면 javascript 및 jQuery를 사용하고 있습니다.

<table id='BuilderTable' class="BuilderTable"> 
    <tbody class='BuilderBody'> 
    </tbody> 
</table> 
<asp:Button runat="server" ID="saveButton" OnClick="SaveButton_Click" OnClientClick="SaveData()" 
    Text="Save Form" /> 
<asp:HiddenField runat="server" ID="controlsData" /> 

내 모든 새로운 컨트롤을 넣을 곳이 표는 다음과 같습니다 내 페이지에 추가 한 후 나는 새로운 컨트롤, 자신의 텍스트를 얻을 수있는 등 내가 그 일을 봤는데 방법이 같은 것입니다.

클라이언트가 저장 버튼이 첫번째 호출이 자바 스크립트/jQuery를 기능을 클릭 한 다음 때 다음 버튼을 클릭에 대한 서버 측 함수가 호출

function SaveData() { 
     var controlRows = $('#BuilderTable tr.control'); 
     var controls= []; 
     controlRows.each(function (index) { 
      //process control information here ... 
      controlText = //use jQuery to get text, etc... 
      var control = { 
       Index: (index + 1), 
       Text: controlText 
      }; 
      controls.push(control); 
     }); 
     var str = JSON.stringify(questions); 
     $('#<%= controlsData.ClientID %>').val(str); 
    } 

(이에서 C#의를, VB에 적응). 이 같은 컨트롤 클래스를 사용

protected void SaveButton_Click(object sender, EventArgs e) 
{ 
     JavaScriptSerializer jss = new JavaScriptSerializer(); 
     string str = controlsData.Value; 
     List<Control> controls = jss.Deserialize<List<Control>>(str); 
} 

: JSON 데이터를 직렬화와의 ASP에 HiddenField에 저장하기 위해 컨트롤을 얻을 수

public class Control 
{ 
     public int Index { get; set; } 
     public string Text { get; set; } 
} 

이 코드는 자바 스크립트를 사용하고 jQuery를 다음 데이터 서버 -를 잡아 코드에서 사용할 수있는 객체로 deserialize합니다. 그런 다음 데이터를 가져와 필요한 모든 작업을 수행하십시오.