C# ASP.NET文本框忽略更新面板

C# ASP.NET文本框忽略更新面板,c#,asp.net,ajax,C#,Asp.net,Ajax,我有一个GridView,其项模板定义如下: public class ToolLogTemplate : ITemplate { public String DataField { get; set; } public ToolLogTemplate(String column) { DataField = column; } public void InstantiateIn(Control container) {

我有一个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();
    }
}
        UpdatePanel updatePanel = new UpdatePanel();
        updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
GridView位于UpdatePanel中,定义如下:

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();
    }
}
        UpdatePanel updatePanel = new UpdatePanel();
        updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
GridView中文本框的TextChanged事件触发页面的完全刷新。我的理解是,通过在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'");
它只是设置文本框的颜色并保存在gridview中的位置。updatepanel与我的菜单和按钮一样工作,只是文本框导致了完整的回发。

看到更新代码后,我修改了我的答案

需要告诉UpdatePanel它应该响应哪些控件。可以通过添加触发器来实现这一点。在您的示例中,GridView中有文本框控件。这些文本框设置为自动回发。由于它们在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);
在codebehind中,您需要执行以下操作:

protected void GridViewRowCommand(object sender, RowCommandEventArgs e)
{
    var myTextBox = e.Row.FindControl("myTextBoxID");
    // Do some work
}
看到更新代码后,我修改了我的答案

需要告诉UpdatePanel它应该响应哪些控件。可以通过添加触发器来实现这一点。在您的示例中,GridView中有文本框控件。这些文本框设置为自动回发。由于它们在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);
在codebehind中,您需要执行以下操作:

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


不幸的是,我一直无法使这里描述的模型工作。相反,我在updatepanel中放置了一个不可见的按钮,让javascript在TextBox onchange事件中单击它。我不知道为什么这个方法有效,而文本更改的方法无效,但这就是它最终的结果。

很不幸,我无法使这里描述的模型有效。相反,我在updatepanel中放置了一个不可见的按钮,让javascript在TextBox onchange事件中单击它。我不知道为什么这个方法有效,而TextChanged one却无效,但这就是它最终的失败原因。

不,你不会误解它只会触发部分回发。。。但整个页面生命周期仍然适用。什么行为没有如您所期望的那样工作?有什么原因不只是在标记中而不是在代码中声明吗?所有内容都是从数据库表中添加的,所以我在后面的代码中执行。至于我所期望的行为,只是更新面板内容刷新,不是整个页面。我尝试在一个干净的测试环境中复制您的问题,并发现它按预期工作:文本框发回,而不会导致页面的其余部分,即UpdatePanel之外的所有内容重新加载。您是否以某种方式将ScriptManager设置为EnablePartialRendering=false?您是否在页面上使用多种Ajax方法?有时它们会发生冲突并导致完整的回发?我们可能需要关于你的项目的更多信息。不,你不会误解它只会触发部分回发。。。但整个页面生命周期仍然适用。什么行为没有如您所期望的那样工作?有什么原因不只是在标记中而不是在代码中声明吗?所有内容都是从数据库表中添加的,所以我在后面的代码中执行。至于我所期望的行为,只是更新面板内容刷新,不是整个页面。我尝试在一个干净的测试环境中复制您的问题,并发现它按预期工作:文本框发回,而不会导致页面的其余部分,即UpdatePanel之外的所有内容重新加载。您是否以某种方式将ScriptManager设置为EnablePartialRendering=false?您是否在页面上使用多种Ajax方法?有时它们会发生冲突并导致完整的回发?我们可能需要关于您的项目的更多信息。我已经编辑了我的原始问题以回应您的回答。糟糕。就像上面提到的@samiz,你在页面上有ScriptManager设置吗?在这个页面派生的母版页中,我有一个脚本管理器,比如:现在我已经阅读了你的更新,我想我知道问题出在哪里了。由于这些文本框位于GridView中,因此需要将GridView.RowCommand事件绑定为触发器。然后,在RowCommandEvent中,您需要查找该行中的文本框并使其相应地运行。我建议删除问题中更新的代码部分。我已编辑了原始问题以响应您的回答。Bummer。就像上面提到的@samiz,你在页面上有ScriptManager设置吗?在这个页面派生的母版页中,我有一个脚本管理器,比如:现在我已经阅读了你的更新,我想我知道问题出在哪里了
m在。由于这些文本框位于GridView中,因此需要将GridView.RowCommand事件绑定为触发器。然后,在RowCommandEvent中,您将需要查找该行中的文本框并使其相应地运行。我建议删除问题中更新的代码部分。