0

我的页面上有大约 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 不是动态创建的。网格视图示例:

<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。

4

2 回答 2

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);
于 2012-10-04T10:43:31.397 回答
0

我找到了一些解决方案:

在网格数据绑定后的 Source 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 样式,请不要忘记将它们添加到目标页面

于 2020-07-21T15:36:15.903 回答