将GridView结构复制到另一个GridView

时间:2012-10-04 08:53:22

标签: asp.net gridview clone

我的页面上有大约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。

2 个答案:

答案 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样式,请不要忘记将它们添加到目标页面中