我在UpdatePanel中有一个GridView。在模板字段中是我用于标记项目的按钮。在功能上,这工作正常,但按钮总是触发整页回发而不是部分回发。如何让按钮触发部分回发?
<asp:ScriptManager ID="ContentScriptManager" runat="server" />
<asp:UpdatePanel ID="ContentUpdatePanel" runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:GridView ID="OrderGrid" runat="server" AllowPaging="false" AllowSorting="false"
AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete"
CommandName="MarkAsComplete" CommandArgument='<%# Eval("Id") %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Name" HeaderText="Name" />
<asp:BoundField DataField="LoadDate" HeaderText="Load Date" />
<asp:BoundField DataField="EmployeeCutOffDate" HeaderText="Cut Off Date" />
<asp:BoundField DataField="IsComplete" HeaderText="Is Completed" />
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
答案 0 :(得分:76)
您需要将每个LinkButton注册为AsyncPostBackTrigger
。在GridView中绑定每一行之后,您需要搜索LinkButton并通过代码隐藏注册它,如下所示:
protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);
}
这也需要为LinkButton设置ClientIDMode="AutoID"
,如上所述here(感谢Răzvan Panda指出这一点)。
答案 1 :(得分:5)
可能没有建议,但您可以通过排除AsyncPostBackTrigger上的EventName来使GridView上的所有内容异步工作,例如。
<Triggers>
<asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>
这将使GridView上的RowCommand事件和任何其他事件异步触发。还要注意,当你创建ClientIDMode =&#34; Static&#34;在GridView上,它将导致完整的回发。
答案 2 :(得分:4)
我的网格视图处于条件模式。
class Object_name {
public:
Object_name (int ll, int rr) : l(ll), r(rr) {}
// data members
int l;
int r;
};
std::vector<Object_name> file_content;
在链接按钮的点击事件中,我把:
std::ifstream in("bragg_events.txt");
if(!in) std::cerr << "Can't open input file!\n";
// read file line by line
std::string line;
while (std::getline(in, line)) {
// extract all numbers by pairs from a single line
std::stringstream ss(line);
int l = 0, r = 0;
while (ss >> l >> r) {
// use a pair of numbers to create an object and store in the vector
file_content.push_back(Object_name(l, r));
}
}
// print pair of numbers
for (auto i = 0; i < file_content.size(); ++i) {
std::cout << file_content[i].l <<" "<< file_content[i].r <<'\n';
}
答案 3 :(得分:1)
将以下元素放在web.config文件中的system.web元素
中<xhtmlConformance mode="Transitional"/>
答案 4 :(得分:0)
MSDN指定UpdatePanel.ChildrenAsTriggers属性“[g]设置或设置一个值,该值指示UpdatePanel控件的直接子控件的回发是否更新了面板的内容”(参见http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx)。
由于您的LinkButton似乎不是“直接子控件”,因此我建议将LinkButton配置为显式的AsyncPostBackTrigger。
在&lt; / ContentTemplate&gt;下面标记,尝试添加:
<Triggers>
<asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
答案 5 :(得分:0)
我有一个问题,我有一个表单工作正常(page1
),另一个表示完整的帖子(page2
)。当我进入第2页时,我做了一点cut/paste
,并且在表单定义中仍然有javascript
调用。
< form id="form1" runat="server" onsubmit="return checkstuff();">
但checkstuff
中未定义page 2
。
删除了onsubmit
,部分帖子开始有效。
在工作页面 - 第1页中,定义了checkstuff
,但它只是一个存根,它只是返回true。只是为了笑容,我在checkstuff
中发出警报,果然,它被调用所有提交,部分或不是。并且,如果我将存根更改为仅返回false,则根本不会发生任何事情。
指出这一切,javascript仍在运用,就像提交整页一样。因此请仔细检查您的客户端脚本。
答案 6 :(得分:-1)
您需要为每个RowState注册每个控件。 1:为RowState = Alternate和Normal注册控件 2:为RowState = Edit注册控件 3:......
ASPX:
<asp:TemplateField HeaderText="">
<ItemTemplate>
<asp:LinkButton runat="server" ID="Btn1"
CommandName="Edit" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-pencil-square-o"></i></asp:LinkButton>
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton ID="Btn2" runat="server" CommandName="Update" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-check"></i></asp:LinkButton>
</EditItemTemplate>
</asp:TemplateField>
代码背后:
protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow
&& (e.Row.RowState == DataControlRowState.Normal
|| e.Row.RowState == DataControlRowState.Alternate))
{
LinkButton Btn1 = e.Row.FindControl("Btn1 ") as LinkButton;
ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn1 );
}
if (e.Row.RowType == DataControlRowType.DataRow
&& e.Row.RowState == DataControlRowState.Edit)
{
LinkButton Btn2 = e.Row.FindControl("Btn2 ") as LinkButton;
ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn2 );
}
}