开发者

Query regarding the nested grid views in asp.net/C#

I have defined a nested grid view in the following way.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound" GridLines="None">
    <Columns>
        <asp:BoundField DataField="Date Of Transaction" HeaderText="Date Of Transaction"
            SortExpression="Date Of Transaction" />
        <asp:BoundField DataField="Invoice Number" HeaderText="Invoice Number" SortExpression="Invoice Number" />
        <asp:BoundField DataField="totalAmount" HeaderText="totalAmount" ReadOnly="True"
            SortExpression="totalAmount" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:GridView ID="gridView2" runat="server" HorizontalAlign="Left" ShowHeader="false" GridLines="None" OnRowDataBound="gridView2_RowDataBound">
                <Columns>
                <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px">
                <ItemTemplate>
                <asp:Button ID="Btn1" runat="server" Text="Download" OnClick="Btn1_Click"/>
                </ItemTemplate>
                </asp:TemplateField>
                </Columns>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
&l开发者_Go百科t;asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ComponentDBConnectionString %>"
    SelectCommand="SelectUserPreviousHistory" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:Parameter DefaultValue="XYZZ" Name="userName" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

The screenshot of the output is here. As you can see i have a "Download" button in each row of the child gridview (i.e., gridView2) but I want the download button to be last column but .net is rendering it to be the first column.

How can I do it?

More over gridview2 datasource is arraylist. Here is the code

gridView2.DataSource = titlesArrayList;
gridView2.DataBind();

Please help me

Thanks in anticipation


Why don't you simply add a Label before the Donwload-Button in the ItemTemplate? You could set the Label's Text in RowDataBound(gridView2_DataBound).

Edit: to show the header columns of the nested gridview in the header of the outer gridview, you could set ShowHeader="false" in the inner grid and use a HeaderTemplate with two labels for "Software Titles" and "Download here" and appropriate CSS-Styles to fit to the inner grid.

Edit:

Here is a working test-page. Pick the parts you didn't understand:

aspx:

    <asp:GridView ID="GrdTransaction" runat="server" OnRowDataBound="GrdTransaction_RowDataBound" AutoGenerateColumns="false">
        <Columns>
        <asp:BoundField DataField="DateOfTransaction" HeaderText="Date Of Transaction"
            SortExpression="DateOfTransaction" />
        <asp:TemplateField>
            <HeaderTemplate>
                <table width="100%" cellspacing="0" cellpadding="0" border="0">
                    <tr>
                        <td><asp:Label ID="LblFileNameHeader" Text="File-Name" runat="server" /></td><td><asp:Label ID="LblDownloadHeader" Text="Download file" runat="server" /></td>
                    </tr>
                </table>
            </HeaderTemplate>
            <ItemTemplate>
                <asp:GridView ID="GrdDocument" runat="server" ShowHeader="false" GridLines="None" AutoGenerateColumns="false"
                    OnRowCommand="GrdDocument_RowCommand" OnRowDataBound="GrdDocument_RowDataBound">
                    <Columns>
                    <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px">
                        <ItemTemplate>
                            <asp:Label ID="LblFileName" Text='<%# Eval("Doc")%>' runat="server" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px">
                        <ItemTemplate>
                            <asp:Button ID="BtnDownload" runat="server" CommandArgument='<%# Eval("Doc")%>' CommandName="Download" Text="Download" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>

Codebehind(converted from vb.net to c#):

public class WebForm1 : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack) {
            this.GrdTransaction.DataSource = GetOuterGridSource();
            this.GrdTransaction.DataBind();
        }
    }

    private DataTable GetOuterGridSource()
    {
        DataTable tbl = new DataTable();
        tbl.Columns.Add(new DataColumn("ID", typeof(Int32)));
        tbl.Columns.Add(new DataColumn("DateOfTransaction", typeof(DateTime)));
        DataRow row = tbl.NewRow();
        row["ID"] = 1;
        row["DateOfTransaction"] = System.DateTime.Now;
        tbl.Rows.Add(row);
        row = tbl.NewRow();
        row["ID"] = 2;
        row["DateOfTransaction"] = System.DateTime.Now;
        tbl.Rows.Add(row);
        row = tbl.NewRow();
        row["ID"] = 2;
        row["DateOfTransaction"] = System.DateTime.Now;
        tbl.Rows.Add(row);
        return tbl;
    }

    private DataTable GetNestedGridSource()
    {
        DataTable tbl = new DataTable();
        tbl.Columns.Add(new DataColumn("ID", typeof(Int32)));
        tbl.Columns.Add(new DataColumn("Doc", typeof(string)));
        DataRow row = tbl.NewRow();
        row["ID"] = 1;
        row["Doc"] = "Smart Defrag";
        tbl.Rows.Add(row);
        row = tbl.NewRow();
        row["ID"] = 2;
        row["Doc"] = "Visio Viewer";
        tbl.Rows.Add(row);
        row = tbl.NewRow();
        row["ID"] = 2;
        row["Doc"] = "Rapid Typing";
        tbl.Rows.Add(row);
        return tbl;
    }

    protected void GrdTransaction_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            dynamic row = ((DataRowView)e.Row.DataItem).Row;
            dynamic GrdDocument = (GridView)e.Row.FindControl("GrdDocument");
            GrdDocument.DataSource = GetNestedGridSource();
            GrdDocument.DataBind();
            GrdDocument.RowCommand += GrdDocument_RowCommand;
        }
    }

    protected void GrdDocument_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            dynamic row = ((DataRowView)e.Row.DataItem).Row;
            dynamic LblFileName = (Label)e.Row.FindControl("LblFileName");
            LblFileName.Text = row("Doc").ToString;
        }
    }

    protected void GrdDocument_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Download") {
            dynamic docName = e.CommandArgument.ToString();
        }
    }
    public WebForm1()
    {
        Load += Page_Load;
    }
}

I have set the LblFileName's Text poperty in GrdDocument_RowDataBound. That is redundant because i've always used eval on the aspx-page. I wanted to show both ways for the sake of completeness.

This is result:

Query regarding the nested grid views in asp.net/C#


in your gridView2, set AutoGenerateColumns="False" and add a asp:BoundField before the asp:TemplateField

Are you sure there is no missing code in your snippet?

<asp:GridView ID="gridView2" runat="server" HorizontalAlign="Left" ShowHeader="false" GridLines="None" OnRowDataBound="gridView2_RowDataBound" AutoGenerateColumns="False">
                <Columns>

                <asp:BoundField HeaderText="" DataField="ToString" />


                <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="100px">
                <ItemTemplate>
                <asp:Button ID="Btn1" runat="server" Text="Download" OnClick="Btn1_Click"/>
                </ItemTemplate>
                </asp:TemplateField>
                </Columns>
                </asp:GridView>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜