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>

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

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

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

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

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

很好,最后我没有收到任何错误消息,但我仍然无法使用 TextChanged 事件。

我不知道这是否有任何帮助,但我发现当我第一次在我的 TextBox 中写一些东西并离开它时,什么也没有发生。但是,当我在 TextBox 中写入内容并再次将其保留时,会发生回发(非异步)。

这到底是怎么回事?

4

3 回答 3

3

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

我的问题似乎起源于我的代码背后,因为我通过注释掉后面的代码中的所有内容并仅实现基本功能(设置 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";
    }

如果放在一起,实际上只有三个重要部分可以完成这项工作:

  1. AJAX 工具包脚本管理器
  2. 使用 OnTextChanged 定义在文本框中触发 TextboxChanged 事件时调用的方法(当然该方法也必须存在于后面的代码中;))
  3. 将文本框中的 AutoPostBack 设置为 true

希望这可以帮助某人摆脱我太久以来遭受的同样痛苦:)

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

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">如果您仍然无法触发它,请尝试在 page_load 事件中写入您的 ID

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

如果你不能访问更新面板

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

写这个代码..我希望可以帮助你。

于 2013-04-11T12:45:25.817 回答