0

次のようなデータベースから質問を取得する datalist itemtemplate 内の .aspx ページに、次のクライアント側コードがあります。

<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を設定することはできません..単純に。私は次のようなことを試みていました:

<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 Web コントロールに置き換えるか、コードビハインドから出力するより良い方法を専門家が提案してください。または、私を正しい方向に向けますか?

ありがとう:0)

4

2 に答える 2

1

ASP コントロールとデータ バインディングの経験がありました。あなたが直面している問題は、おそらく、マークアップを介してコントロールを宣言すると、データ バインディングからアクセスできないという事実です。また、サーバー側の ID とクライアント側の ID を混同しないでください。

コントロールのプロパティにマップされたサーバー側 ID は、Idコード ビハインドからコントロールにプログラムでアクセスするために使用されます。クライアント側 ID は、タグの属性に配置され、プロパティidにマップされる ID です。ClientId

あなたの質問から判断すると、必要なのは複数選択式の調査を作成することです。私の意見では、ID がどのように生成されるかは重要ではなく、質問ごとに ID が適切にグループ化されていることだけが重要です。

あなたの質問の一部である、データバインディングでコントロールにプログラムでアクセスする部分に答えます。

これが私のコードの例です。このような非常に単純な GridView があるとします。

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

データバインディング中にデータセットを取得し、いくつかのプロパティに従って画像を設定します。これは DataList と同じように機能します。心配はいりません。

ここで、コード ビハインドで、RowDataBoundEvent. imgExampleItemTemplate の子であるため、オブジェクトに直接アクセスすることはできません。行がバインドされると、行に直接アクセスできるようになり、クラスのFindControlメソッドを使用できますControl

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";
        }
}

あなたのケースへの適用

複数選択式の調査を作成するために、私のアドバイスは、質問を保持する DataList (外側のコントロール) を作成し、各行に対して、回答を保持する RadioButtonList (内側のコントロール) を宣言することです。外部データ リストを質問と回答のデータ セットにバインドします。RowDataBound イベントまたは DataList ワールドで呼び出されたものを処理します。そのイベントを処理するときは、内側の radiobuttonlist を回答にバインドします。

それはあなたのために働くはずです

于 2011-01-12T14:27:43.033 に答える
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" />

このテーブルは、すべての新しいコントロールを配置する場所です。

次に、クライアントが保存ボタンをクリックすると、最初に次の javascript / 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);
}

次のように Control クラスを使用します。

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

このコードでは、javascript と jQuery を使用してコントロールを取得し、JSON を使用してデータをシリアル化し、それを asp hiddenfield に保存してから、サーバー側でデータを取得し、コードで使用できるオブジェクトに逆シリアル化します。次に、データを取得して、必要なことを行います。

于 2011-01-12T14:38:05.863 に答える