我有一个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按预期工作,其中包含我的菜单和按钮,它只是导致完整回发的文本框。
答案 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没有,但这就是它最终失败的方式。