我的页面上有大约11个GridView:GridView1,GridView2,... GridView10和GridViewActive。 GridView1到GridView10是不可见的,但GridViewActive是可见的。 根据不同的条件,我需要将一个GridView的结构复制到GridViewActive。 我需要做一些像
这样的事情//common params
SqlDataSource1.SelectParameters["CommonParam1"].DefaultValue = this.commonParam1;
if (reportname = "report1")
{
SqlDataSource1.SelectParameters["Param"].DefaultValue = this.param;
CopyGridViewStructure(GridView1, GridViewActive);
}
else if (reportname = "report2")
{
SqlDataSource1.SelectParameters["AnotherParam"].DefaultValue = this.anotherParam;
CopyGridViewStructure(GridView2, GridViewActive);
}
etc.
// DO OTHER STAFF WITH GRIDVIEWATIVE HERE AND IN OTHER METHODS
按下按钮(实际上它比简单的ButtonClick复杂一点,因为它是调用Button click的Ajax,而按钮实际上对用户是不可见的):
//this block doesn't work for now, because grvActive doesn't have any structure
this.grvActive.DataSource = SqlDataSource1;
this.grvActive.DataBind();
我只需要复制列。没有为此找到溶剂。 GridView不包含克隆方法。
编辑:
GridView1到GridView10和GridViewActive不是动态创建的。 GridView示例:
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" Visible="false">
<Columns>
<asp:BoundField DataField="username" HeaderText="First Name">
<ItemStyle Width="110px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="usersurname" HeaderText="Last Name">
<ItemStyle Width="110"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="usertype" HeaderText="User Type">
<ItemStyle Width="100px"></ItemStyle>
</asp:BoundField>
<asp:TemplateField HeaderText="Login">
<ItemTemplate>
<asp:Label runat="server" ID="lblLastModifyDate" Text='<%# MyUtility.MyCommon.FormatDate(Eval("logindate").ToString()) %>' />
</ItemTemplate>
<ItemStyle Width="177px"></ItemStyle>
</asp:TemplateField>
</Columns>
</asp:GridView>
其他GridView非常相似,但具有不同的列名和数据字段。其中一些包含不同的TemplateField,有些根本没有TemplateField。
答案 0 :(得分:0)
我还没有找到复制GridView结构的解决方案,但是,我找到了解决问题的方法。而不是克隆结构,我保存GridView ID,然后我使用FindControl。
private string GridID
{
get
{
return ViewState["GridID "].ToString();
}
set
{
ViewState["GridID "] = value;
}
}
然后
SqlDataSource1.SelectParameters["CommonParam1"].DefaultValue = this.commonParam1;
if (reportname = "report1")
{
SqlDataSource1.SelectParameters["Param"].DefaultValue = this.param;
// //CopyGridViewStructure(GridView1, GridViewActive);
GridID = "GridView1";
}
else if (reportname = "report2")
{
SqlDataSource1.SelectParameters["AnotherParam"].DefaultValue = this.anotherParam;
CopyGridViewStructure(GridView2, GridViewActive);
GridID = "GridView2";
}
etc.
当我需要使用gridView时,我正在使用FindControl:
GridView grd = (GridView) this.FindControl(GridID);
// actually for my page I am using masterpage and FindControl is a bit more complicated:
GridView grd = (GridView)((ContentPlaceHolder)(this.Controls[0].FindControl("mainContent"))).FindControl(GridID);
答案 1 :(得分:0)
我找到了解决方法:
在网格数据绑定后的源aspx中:
Session["gridtoexcel"] = yourgrid;
目标aspx
var grid = ((GridView)Session["gridtoexcel"]);
gridToExcel.Columns.Clear();
foreach (DataControlField col in grid.Columns)
gridToExcel.Columns.Add(col);
gridToExcel.DataSource = grid.DataSource;
gridToExcel.DataBind();
这样,我可以将精确的网格“克隆”到另一个页面。 如果您需要某些CSS样式,请不要忘记将它们添加到目标页面中