由UpdatePanel内的GridView内的LinkBut​​ton触发的完整回发

时间:2011-02-02 08:29:53

标签: c# asp.net gridview asp.net-ajax updatepanel

我在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>

7 个答案:

答案 0 :(得分:76)

您需要将每个LinkBut​​ton注册为AsyncPostBackTrigger。在GridView中绑定每一行之后,您需要搜索LinkBut​​ton并通过代码隐藏注册它,如下所示:

protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)  
{  
   LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;  
   ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);  
}  

这也需要为LinkBut​​ton设置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)。

由于您的LinkBut​​ton似乎不是“直接子控件”,因此我建议将LinkBut​​ton配置为显式的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 );      
    }
}