【发布时间】: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 方法(有时它们会发生冲突并导致完整的回发)?我们可能需要有关您的项目的更多信息。