【问题标题】:ASP.NET TextBox ignores update panelASP.NET TextBox 忽略更新面板
【发布时间】:2011-01-21 00:38:40
【问题描述】:

我有一个 GridView,其项目模板定义如下:

public class ToolLogTemplate : ITemplate
{
    public String DataField { get; set; }

    public ToolLogTemplate(String column)
    {
        DataField = column;
    }

    public void InstantiateIn(Control container)
    {
        var textBox = new TextBox();
        textBox.ClientIDMode = ClientIDMode.Predictable;
        textBox.CssClass = "ToolLog";
        textBox.AutoPostBack = true;
        textBox.DataBinding += textBox_DataBinding;

        container.Controls.Add(textBox);
    }

    void textBox_DataBinding(object sender, EventArgs e)
    {
        var textBox = (TextBox)sender;
        var context = DataBinder.GetDataItem(textBox.NamingContainer);
        textBox.Text = DataBinder.Eval(context, DataField).ToString();
    }
}

GridView 位于 UpdatePanel 中,定义如下:

        UpdatePanel updatePanel = new UpdatePanel();
        updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;

GridView 中TextBoxes 的TextChanged 事件触发页面的完全刷新。我的理解是,通过将 TextBoxes 包装在 UpdatePanel 中,它会触发部分刷新。我是不是误会了?

针对问题的最新评论进行更新:

我在文本框中附加了一些 javascript:

                currentTextBox.Attributes.Add("onFocus", String.Format("document.getElementById('RowTextBox').value = {0}; document.getElementById('ColTextBox').value = {1}; this.style.backgroundColor='#ffeb9c';", i, j));
                currentTextBox.Attributes.Add("onBlur", "this.style.backgroundColor='#ffffff'");

它只是设置文本框的颜色并保存它在网格视图中的位置。更新面板与我在其中的菜单和按钮按预期工作,只是导致完整回发的文本框。

【问题讨论】:

  • 不,您没有误解它只会触发部分回发...但是整个页面生命周期仍然适用。哪些行为没有按您的预期工作?
  • 还有什么理由不只是在标记中而不是在代码中声明它?
  • 所有内容都是从数据库表中添加的,所以我在后面的代码中进行。
  • 至于我期望的行为,它只是更新面板内容刷新,而不是整个页面。
  • 我尝试在干净的测试环境中重现您的问题,发现它按预期工作:文本框回发而不会导致页面的其余部分(即 UpdatePanel 之外的所有内容)重新加载。您是否以某种方式将 ScriptManager 设置为 EnablePartialRendering = false?您是否在页面上使用了多种 Ajax 方法(有时它们会发生冲突并导致完整的回发)?我们可能需要有关您的项目的更多信息。

标签: c# asp.net ajax


【解决方案1】:

看到更新代码,我已经修改了我的答案...

需要告知 UpdatePanel 它应该响应哪些控件。您可以通过添加触发器来做到这一点。在您的情况下,您在 GridView 中有 TextBox 控件。这些文本框设置为自动回发。由于它们在 GridView 中,我相信 GridView 将它们视为 RowCommand。使用您的原始代码,我建议您添加以下内容:

UpdatePanel updatePanel = new UpdatePanel();
updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;

gridView.OnRowCommand = "GridViewRowCommand";

AsyncPostbackTrigger newTrigger = new AsyncPostbackTrigger();
newTrigger.ControlID = gridView.ControlID;
updatePanel.Triggers.Add(newTrigger);

在您的代码隐藏中,您需要执行以下操作:

protected void GridViewRowCommand(object sender, RowCommandEventArgs e)
{
    var myTextBox = e.Row.FindControl("myTextBoxID");
    // Do some work
}

【讨论】:

  • 我已根据您的回答编辑了我原来的问题。
  • 无赖。就像@samiz 提到的那样,您在页面上设置了 ScriptManager 吗?
  • 在母版页(此页面派生自)中,我有一个脚本管理器,例如:
  • 现在我重新阅读了您的更新,我想我知道问题出在哪里了。由于这些文本框位于 GridView 中,因此您需要将其绑定为触发器的 GridView.RowCommand 事件。然后,在 RowCommandEvent 中,您需要“FindControl”该行中的文本框并使其行为相应。
  • 我建议您删除问题中那些更新的代码部分。
【解决方案2】:

不幸的是,我永远无法使这里描述的模型工作。相反,我在更新面板中放置了一个不可见的按钮,并让 javascript 在文本框的 onchange 事件上单击它。我不知道为什么这种方法有效而 TextChanged 无效,但这就是它最终失败的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多