0

ユーザーの入力を処理できるように、UpdatePanel 内の TextBox の TextChanged イベントを発生させたいと考えています。

これまでに思いついたのは、次のコードです。

<asp:GridView ID="gdBestellliste" AutoGenerateColumns="false" runat="server"
                    Width="100%" AllowPaging="false" GridLines="Horizontal" EnableModelValidation="true"
                    BorderColor="#6893CF" PagerStyle-BackColor="#F0F0F0" HeaderStyle-Height="20" ShowFooter="false">
     <Columns>

          <asp:TemplateField HeaderText="Amount to order" HeaderStyle-BorderStyle="None" HeaderStyle-HorizontalAlign="left" HeaderStyle-Width="70px"
                             ItemStyle-HorizontalAlign="left" ItemStyle-Wrap="false" ItemStyle-VerticalAlign="Middle" ItemStyle-CssClass="DataCell">

               <ItemTemplate>
                    <asp:UpdatePanel runat="server">
                         <ContentTemplate>
                              <asp:TextBox runat="server" ID="tbProductLookup" OnTextChanged="tbProductLookup_Changed" AutoPostBack="true"></asp:TextBox>
                         </ContentTemplate>
                    </asp:UpdatePanel>
               </ItemTemplate>

          </asp:TemplateField>

     </Columns>

</asp:GridView>

ここでの問題は、Textbox に入力を行い、その後 TextChanged イベントが発生しようとすると、Internet Explorer デバッガーからエラーが発生することです。

Sys.WebForms.PageRequestManagerServerErrorException: GUID should contain 32 digits with 4 dashes

TextChanged イベント用に定義した分離コード メソッドには到達しません。

それで、私は何を間違っていますか?どんな助けでも大歓迎です:)

更新: 私の問題の一部は、私の側からの誤った情報だったようです。コード ビハインドの必要な部分のみが更新パネルによって読み込まれると仮定しましたが、これは完全に間違っていることがわかりました。したがって、私のコードのどこかに空の GUID が作成され、最終的に PageRequestManagerServerErrorException が発生しました。

ようやくエラー メッセージが表示されなくなりましたが、まだ TextChanged イベントを使用できません。

これが役立つかどうかはわかりませんが、TextBox に最初に何かを書き込んでそのままにしておくと、何も起こらないことがわかりました。しかし、TextBox に何かを書き込んで再びそのままにしておくと、ポストバック (非同期ではない) が発生します。

一体何が起こっているのですか?

4

3 に答える 3

3

まず第一に、私の問題を解決するのを手伝ってくれたすべての人に感謝します. 私がスタックオーバーフローを愛する唯一の理由はあなたです。

私の問題は、コード ビハインドからすべてをコメントアウトし、基本的な機能 (Datasource を GridView に設定してバインドし、TextChanged イベントによって呼び出されるメソッドを定義する) を実装することで解決したため、コード ビハインドに起因しているようです。

私と同じ問題に出くわし、たまたまこれを読んだすべての人々のために、グリッドビューの更新パネルで TextChanged イベントを作成する場合に実装する必要があることを示したいと思います。

ASPX ファイル:

    <form id="form1" runat="server">
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
        </asp:ToolkitScriptManager>
    <div>
        <asp:GridView ID="yourGridviewID" runat="server">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:UpdatePanel runat="server">
                            <ContentTemplate>
                                <asp:TextBox ID="yourTextboxId" OnTextChanged="yourTextboxId_Changed" runat="server" AutoPostBack="true"></asp:TextBox>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>


    </div>
</form>

コードビハインド:

protected void Page_Load(object sender, EventArgs e) {
        //The following code from here
        DataTable dt = new DataTable();
        dt.Rows.Add(dt.NewRow());
        gdBestellliste.DataSource = dt;
        gdBestellliste.DataBind();
        //to here can vary. It depends on how you want/need to bind data to your gridview 
        //with this code I just wanted to show an empty gridview row where I can test this solution
    }

    protected void tbProductLookup_Changed(object sender, EventArgs e) {
        //Just writing WTF to the textbox at OnTextChanged event. Do whatever you need to do ;)
        TextBox tb = (TextBox)sender;
        tb.Text = "WTF";
    }

まとめると、これを機能させるための重要な部分は 3 つだけです。

  1. AJAX ToolkitScriptManager
  2. OnTextChanged を使用してテキスト ボックスで TextboxChanged イベントが発生したときに呼び出されるメソッドを定義します (確かに、このメソッドはコード ビハインドにも存在する必要があります;))。
  3. テキストボックスの AutoPostBack を true に設定します

うまくいけば、これが私があまりにも長い間苦しんでいた同じ悲惨さから誰かを助けることができます:)

更新: 分離コードで TextboxChanged イベントが発生しなかった原因がわかりました。質問の更新で述べたように、コードビハインド ファイルはすべて Updatepanel によって読み込まれます。しかし、ポストバックがないときにデータソースを設定し、ページロード時にグリッドビューをバインドしただけなので、updatepanel によってグリッドビューが正しく表示されたにもかかわらず、グリッドビューが読み込まれず、イベントが発生しませんでした。ポストバック時にデータソースを設定できないようにするために、次の簡単な解決策を見つけました。

if(!IsPostBack || YourToolkitScriptManagerID.IsInAsyncPostBack) SetDatasource();

したがって、Updatepanel は、非同期ポストバックを開始するときに Gridview を完全に認識します。

于 2013-04-11T15:03:17.050 に答える
1

の後に次の行を追加します </ContentTemplate>

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="txtboxid" EventName="TextChanged" >
</Triggers>
于 2013-04-11T10:14:26.370 に答える
0

あなたの更新パネルには「ID」がありません

  <asp:UpdatePanel runat="server">
                     <ContentTemplate>
                          <asp:TextBox runat="server" ID="tbProductLookup" OnTextChanged="tbProductLookup_Changed" AutoPostBack="true"></asp:TextBox>
                     </ContentTemplate>
                </asp:UpdatePanel>
           </ItemTemplate>

<asp:UpdatePanel ID="MyID" runat="server">それでも発火できない場合は最後に ID を取得してください pls は page_load イベント内に書き込んでみてください

TextBox tbProductLookup = (TextBox)MyUpdatePanelID.FindControl("tbProductLookup");
ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(tbProductLookup);
            UpdatePanelControlTrigger trigger = new PostBackTrigger();
            trigger.ControlID = tbProductLookup.UniqueID;
            UpdatePanel1.Triggers.Add(trigger);

updatepanel にアクセスできない場合

UpdatePanel MyUpdatePanel = (UpdatePanel)mygridview1.FindControl("MyUpdatePanel");

このコードを書いてください..私はあなたを助けることができることを願っています.

于 2013-04-11T12:45:25.817 に答える