为scriptManager.RegisterPostBackControl(控件)使用动态网格链接按钮时出现问题,因为



我试图在网格的动态创建链接按钮上下载csv文件。我在asp.net中下载csv时遇到了问题。异常:Sys.WebForms.PageRequestManagerParserErrorException此异常通过使用以下代码解决:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(this.grouplnkbutton);

在page_load事件中,但是this.grouplinkbutton(动态创建的链接按钮,即grouplnkbutton控件在page_lead事件中不可用(。

如何在pageload事件中使用链接按钮和scriptmanager。

代码:

protected void Page_Load(object sender, EventArgs e)
{
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(this.grouplnkbutton);
//codes
}
protected void hlGroupName_Click(object sender, EventArgs e)
{
try`enter code here`
{
Response.ClearHeaders();
Response.ClearContent();
grouplnkbutton = sender as LinkButton;
string linkBtnValue = grouplnkbutton.CommandArgument;
GridDataItem item = grouplnkbutton.NamingContainer as GridDataItem;
ExportToCSV exportToCSV = new ExportToCSV();
StringBuilder csv = new StringBuilder();
DataSet gridData = new DataSet();
int scheduleId = Convert.ToInt32(((HiddenField)item.FindControl("hidID")).Value);
csv = exportToCSV.ExportScheduleDataToCSV(scheduleId);
Response.Buffer = true;
Response.Clear();
Response.ContentType = "text/csv";
Response.AddHeader("content-disposition", "attachment;filename=perfscheduleReport.csv");
//Response.Charset = "";
Response.Output.Write(csv.ToString());
//Response.Write(csv.ToString());
Response.Flush();
//Response.End();
}

感谢您的解决方案。标记码

<telerik:RadGrid ID="PerfGrid" GridLines="None" runat="server" CssClass="BorderGrid" OnItemDataBound="PerfGrid_ItemDataBound" OnItemCommand ="PerfGrid_ItemCommand"
              Skin="Default" Width="100%" PageSize="100" PagerStyle-PageSizeLabelText="Records Per Page" AllowFilteringByColumn="true" OnNeedDataSource="PerfGrid_NeedDataSource" OnPageIndexChanged="PerfGrid_PageIndexChanged">
              <ClientSettings EnableRowHoverStyle="true">
                  <Resizing AllowColumnResize="True" AllowRowResize="false" ResizeGridOnColumnResize="false"
                      ClipCellContentOnResize="true" EnableRealTimeResize="false" AllowResizeToFit="true" />
              </ClientSettings>
              <MasterTableView CommandItemDisplay="None" HorizontalAlign="NotSet" AllowPaging="false" AutoGenerateColumns="False" AllowSorting="true" AllowFilteringByColumn="True">
                  <HeaderStyle CssClass="GridHeader" Font-Bold="true"></HeaderStyle>
                  <ItemStyle BackColor="White" CssClass="text2" HorizontalAlign="Left" />
                  <AlternatingItemStyle BackColor="#E6EEF8" CssClass="text2" HorizontalAlign="Left" />
                  <%--<PagerStyle AlwaysVisible="true" Mode="NextPrevAndNumeric" />--%>
                  <Columns>
                      <telerik:GridBoundColumn DataField="ScheduleId" Display="false" ReadOnly="true" HeaderText="ID" AllowFiltering="false" HeaderStyle-Width="10px">
                      </telerik:GridBoundColumn>
                      <telerik:GridTemplateColumn HeaderText="Select" HeaderStyle-Width="15px" AllowFiltering="false">
                          <ItemTemplate>
                              <asp:CheckBox ID="CheckSelect" runat="server"></asp:CheckBox>
                          </ItemTemplate>
                      </telerik:GridTemplateColumn>
                      <telerik:GridTemplateColumn DataField="GroupingName" ReadOnly="true" HeaderText="Group Name" SortExpression="GroupName" HeaderStyle-Width="20px">
                            <ItemTemplate>
                      <asp:LinkButton ID="hlGroupName" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "GroupingName") %>' OnClick="hlGroupName_Click"></asp:LinkButton>  <%--CommandName="Export"--%>
                      <%--<asp:HyperLink ID="hlTestCase" CommandName="Edit1" runat="server" Text='<%# Container.DataItem("TestDescription") %>'--%>
                          Target="_self"></asp:HyperLink>--%>
                      <asp:HiddenField ID="hidID" runat="server" Value='<%# CheckNull(DataBinder.Eval(Container.DataItem, "ScheduleId") , false)%>' />
                        <%--Value='<%# Container.DataItem("Id") %>' Value='<%# DataBinder.Eval(Container.DataItem, "Id") %>--%>
                  </ItemTemplate>
                      </telerik:GridTemplateColumn>
                      <telerik:GridBoundColumn SortExpression="TestDescription" DataField="TestDescription" ReadOnly="true" HeaderText="Test Cases" HeaderStyle-Width="30px">
                                  </telerik:GridBoundColumn>
                      <telerik:GridBoundColumn SortExpression="ServerIP" DataField="ServerIP" ReadOnly="true" HeaderText="Server IP" HeaderStyle-Width="20px">
                      </telerik:GridBoundColumn>
                      <telerik:GridBoundColumn SortExpression="LoadNoOfUsersTobeSimulated" DataField="LoadNoOfUsersTobeSimulated" HeaderText="Users Load" ReadOnly="true" HeaderStyle-Width="12px">
                      </telerik:GridBoundColumn>
                      <telerik:GridBoundColumn SortExpression="StartTime" DataField="StartTime" HeaderText="Start Time" ReadOnly="true" HeaderStyle-Width="25px">
                      </telerik:GridBoundColumn>
                      <telerik:GridBoundColumn SortExpression="EndTime" DataField="EndTime" HeaderText="End Time" ReadOnly="true" HeaderStyle-Width="25px">
                      </telerik:GridBoundColumn>
                  </Columns>
              </MasterTableView>
          </telerik:RadGrid>

在这个lnkbtn-ID-";hlGroupname";onclick事件我想下载csv但正在获取异常:Sys.WebForms.PageRequestManagerParserErrorException已解决异常使用:

protected void Page_Load(object sender, EventArgs e)
{
ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
ScriptManager.RegisterPostBackControl(this.PerfGrid);
//codes
}

我正在使用Scriptmanager,因为我的网格位于updatepanel下。这里PerfGrid是telerikGrid控制。代替网格控制,我想使用动态创建的网格链接按钮。点击我想下载csv的lnkbutton事件。

Hum,您的代码看起来不错,但为什么需要注册脚本?

转储你在加载事件中的代码,我认为没有必要??

你没有张贴你的标记,但说这样的网格:

<asp:GridView ID="GridView1" runat="server" CssClass="table" AutoGenerateColumns="False" DataKeyNames="ID">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True"  />
<asp:BoundField DataField="ProjectName" HeaderText="ProjectName" />
<asp:BoundField DataField="ProjectDate" HeaderText="ProjectDate"  />
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton runat="server" OnClick="LinkButton1_Click">My Link</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

你的按钮代码看起来很好。

我(到目前为止(还不明白为什么任何对注册脚本或按钮事件的需求都需要那个代码。你可以直接连接点击事件,不需要做更多的事情。

所以,在上面,链接按钮应该很好。检查并删除链接按钮的回邮URL设置-这可能是您的问题(但是,您至少没有发布链接按钮的标记。

它应该只需要您拥有的click even代码——不需要其他设置,如post-back URL,按钮点击事件就可以工作。事实上,为什么你使用LinkButton而不是说按钮,这一点都不清楚?(我认为不需要链接按钮(。

所以,没有真正的原因注册脚本的东西-删除它。

请注意,我不必包括PK行";ID";在标记中,甚至隐藏字段中。datakeys设置正是出于这个原因(从安全的角度来看,这很好——我不必渲染PK行ID有隐藏字段或任何东西。

因此,此代码可以获得PK id

protected void LinkButton1_Click(object sender, EventArgs e)
{
LinkButton lBtn = sender as LinkButton;
GridViewRow gRow = lBtn.NamingContainer as GridViewRow;
// get row click index with gRow.RowIndex
int? pkID = GridView1.DataKeys[gRow.RowIndex]["ID"] as int?;

我填写gv的代码是:

using (SqlCommand cmdSQL = new SqlCommand("SELECT * from Project"L, conn))
{
conn.Open();
GridView1.DataSource = cmdSQL.ExecuteReader();
GridView1.DataBind();
}

现在,当然,如果您使用行数据绑定任何事情?然后不要将GV绑定到读取器,而是使用以下内容:

conn.Open();
DataTable rstData = new DataTable();
rstData.Load(cmdSQL.ExecuteReader();
GridView1.DataSource = rstData;
GridView1.DataBind();

最新更新