C# ASP.NET文本框忽略更新面板
我有一个GridView,其项模板定义如下: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) {
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中,您将需要查找该行中的文本框并使其相应地运行。我建议删除问题中更新的代码部分。