Запрос относительно вложенных видов сетки в asp.net/C# - PullRequest
3 голосов
/ 31 марта 2011

Я определил вложенную сетку следующим образом.

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

Снимок экрана вывода здесь .Как вы можете видеть, у меня есть кнопка «Загрузить» в каждой строке дочернего вида сетки (т. Е. GridView2), но я хочу, чтобы кнопка загрузки была последним столбцом, а .net отображает ее как первый столбец.

Как я могу это сделать?

Более того, источник данных gridview2 - arraylist.Вот код

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

Пожалуйста, помогите мне

Спасибо в ожидании

Ответы [ 2 ]

5 голосов
/ 31 марта 2011

Почему бы вам просто не добавить метку перед кнопкой Donwload в ItemTemplate? Вы можете установить текст метки в RowDataBound (gridView2_DataBound).

Редактировать: чтобы показать столбцы заголовка вложенного вида сетки в заголовке внешнего вида сетки, вы можете установить ShowHeader="false" во внутренней сетке и использовать шаблон HeaderTemplate с двумя метками для «Названия программ» и «Скачать здесь» и соответствующие CSS-стили, чтобы соответствовать внутренней сетке.

Редактировать :

Вот рабочая тестовая страница. Выберите части, которые вы не поняли:

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>

Код позади (преобразован из vb.net в 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;
    }
}

Я установил текстовую переменную LblFileName в GrdDocument_RowDataBound. Это избыточно, потому что я всегда использовал eval на странице aspx. Я хотел показать оба пути ради полноты.

Это результат:

enter image description here

1 голос
/ 31 марта 2011

в вашем gridView2, установите AutoGenerateColumns = "False" и добавьте asp: BoundField перед asp: TemplateField

Вы уверены, что в вашем фрагменте отсутствует пропущенный код?

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...