ASP.NET TextBox忽略更新面板

时间:2011-01-21 00:38:41

标签: 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)
    {
        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事件触发页面的完全刷新。我的理解是,通过将TextBox包装在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按预期工作,其中包含我的菜单和按钮,它只是导致完整回发的文本框。

2 个答案:

答案 0 :(得分:0)

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

需要告诉UpdatePanel应该响应哪些控件。您可以通过添加触发器来完成此操作。在您的情况下,您在GridView中有TextBox控件。这些文本框设置为autopostback。由于它们在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
}

答案 1 :(得分:0)

不幸的是,我从未能够使这里描述的模型起作用。相反,我在updatepanel内部放置了一个隐形按钮,并在onbox事件的文本框上单击它。我不知道为什么这个方法有效,TextChanged没有,但这就是它最终失败的方式。