0

私のページには約 11 個の GridView があります: GridView1、GridView2、... GridView10 および GridViewActive。GridView1 から GridView10 は非表示ですが、GridViewActive は表示されます。さまざまな条件に基づいて、1 つの 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

そしてボタンクリック時 (実際には、ボタンクリックを呼び出すのは Ajax であり、ボタンは実際にはユーザーには見えないため、単純な ButtonClick よりも少し複雑です):

//this block doesn't work for now, because grvActive doesn't have any structure
this.grvActive.DataSource = SqlDataSource1; 
this.grvActive.DataBind();

列のみをコピーする必要があります。これに対する解決策は見つかりませんでした。GridView には Clone メソッドが含まれていません。

編集:

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 を含むものもあれば、TemplateFields をまったく含まないものもあります。

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 に答える