TextboxChanged事件未在更新面板中触发

时间:2013-04-11 10:05:45

标签: asp.net ajax textbox updatepanel

我想在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>

我的问题是,当我在文本框中输入并且之后TextChanged事件尝试触发时,我从Internet Explorer调试器中收到错误:

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

它永远不会出现我为TextChanged事件定义的代码隐藏方法。

那么我做错了什么?任何帮助将不胜感激:)

更新 似乎我的问题的一部分是我的错误信息。我假设只有后面代码所需的部分才会被更新面板加载,我现在学到的是完全错误的。因此,我的代码后面的某个地方创建了一个空的GUID,最终导致了PageRequestManagerServerErrorException。

很好,最后我没有错误信息,但我仍然无法使用TextChanged事件。

我不知道这是否有任何帮助,但我发现当我第一次在TextBox中写一些内容并且没有任何反应时。但是当我在TextBox中写入内容并再次保留它时会发生回发(没有异步)。

到底是怎么回事?

3 个答案:

答案 0 :(得分:3)

首先:感谢所有试图帮助我解决问题的人。你是我喜欢stackoverflow的唯一理由。

我的问题似乎源于我的代码背后,因为我通过注释后面的代码中的所有内容并仅实现基本功能(设置和绑定Datasource到GridView,定义由TextChanged事件调用的方法)来解决它。

对于遇到与我相同的问题的所有人并碰巧阅读本文,如果您想在gridview的更新面板中创建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";
    }

如果放在一起,实际上只有三个重要部分可以做到这一点:

  1. AJAX ToolkitScriptManager
  2. 定义使用OnTextChanged在文本框中触发TextboxChanged事件时调用的方法(当然,该方法也必须存在于代码中;)
  3. 将文本框中的AutoPostBack设置为true
  4. 希望这可以帮助某些人摆脱我长期存在的同样痛苦:)

    <强>更新 我刚刚发现Codebehind中的内容导致TextboxChanged事件没有发生。就像我在更新我的问题时说的那样:代码隐藏文件的所有内容都将由Updatepanel加载。但是由于我没有设置数据源并且在没有回发的情况下将页面视图绑定到gridview,尽管由于更新面板正确显示了gridview,但是gridview没有被加载,因此事件不会发生。为了仍然无法在回发时设置数据源,我找到了以下简单的解决方案:

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

    因此,Updatepanel在启动异步回发时完全了解Gridview。

答案 1 :(得分:1)

</ContentTemplate>

之后添加以下行
<Triggers>
  <asp:AsyncPostBackTrigger ControlID="txtboxid" EventName="TextChanged" >
</Triggers>

答案 2 :(得分:0)

您的updatepanel没有“ID”

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

如果您仍然无法点击它,则将您的ID作为<asp:UpdatePanel ID="MyID" runat="server">结束。请尝试在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");

写下这些代码。我希望可以帮到你。