2

ASP.NETデータグリッドに次のコードがあります。

<asp:TemplateField HeaderText="" Visible="True" >
                            <ItemTemplate>
                            <%--<asp:TextBox ID="txtAnswer" Text='<%# Bind("Answer") %>' runat="server" 
                                       TextMode="MultiLine" Height="76px" MaxLength="2000" Width="377px"  >
                            </asp:TextBox>--%>
                            <asp:HiddenField ID="hfQuestionID" Value='<%# Bind("QuestionID") %>' runat="server" />
                            <asp:HiddenField ID="hfAnswerID" Value='<%# Bind("AnswerID") %>' runat="server" />
                            <asp:HiddenField ID="hfAnswer" Value='<%# Bind("Answer") %>' runat="server" />
                            <asp:PlaceHolder ID="ph1" runat="server" />
                            <%--<%# GetAnswerControl(DataBinder.Eval(Container.DataItem,"QuestionID").ToString(), 
                                DataBinder.Eval(Container.DataItem,"Answer").ToString()) %>--%>
                            </ItemTemplate>
                           <EditItemTemplate>
                            <asp:HiddenField ID="hfQuestionID" Value='<%# Bind("QuestionID") %>' runat="server" />
                            <asp:HiddenField ID="hfAnswerID" Value='<%# Bind("AnswerID") %>' runat="server" />
                            <asp:HiddenField ID="hfAnswer" Value='<%# Bind("Answer") %>' runat="server" />
                            <asp:PlaceHolder ID="ph1" runat="server" />
                               <%--<asp:TextBox ID="txtAnswer" Text='<%# Bind("Answer") %>' runat="server" 
                                       TextMode="MultiLine" Height="76px" MaxLength="2000" Width="377px"  ></asp:TextBox>--%>
                           </EditItemTemplate>
                         </asp:TemplateField>

プレースホルダーには、ユーザーが入力する必要のある回答の種類に応じて、テキストボックスまたはドロップダウンリストのいずれかが動的に入力されます。最初の回答フィールド(テキストボックスまたはドロップダウン)をレンダリングするコードは正常に機能します。

ただし、ボタンクリックイベントを発生させると、プレースホルダーのcontrolsプロパティは常に空になります。なぜこうなった?私はこれについて何日も頭を悩ませてきましたが、それは私には意味がありません。

データグリッドの動的に追加されたコントロールにアクセスしようとしているスニペットは次のとおりです...何が間違っているのですか?

foreach (GridViewRow r in gridUserSupplierTypeQuestionsAndAnswers.Rows)
        //if (IsRowModified(r))
        //{
        //    gridUserSupplierTypeQuestionsAndAnswers.UpdateRow(r.RowIndex, false);
        //}
        {
            PlaceHolder ph =(PlaceHolder) r.FindControl("ph1");
            Control c = ph.FindControl("Answer");
            string answer = string.Empty;
            if(c.GetType() == typeof(TextBox))
            {
                TextBox tb = (TextBox) c;
                answer = tb.Text;
            }
            else if (c.GetType() == typeof(DropDownList))
            {
                DropDownList dl = (DropDownList)c;
                answer = dl.SelectedValue;
            }
4

1 に答える 1

0

結局、プレースホルダーを放棄し、代わりにテキストボックスとドロップダウンリストの 2 つのコントロールを使用し、それらの可視性を false に設定しました。

回答の種類をデータベースに保存し、その値に応じて、ヘルパー関数を介して適切なコントロールをオンにします。これを処理するもっとエレガントな方法があるかもしれませんが、私は時間に余裕がなく、これを機能させる必要があります。

于 2012-12-14T19:49:48.430 に答える