为 GridView 中的每一行添加附加数据

问题描述 投票:0回答:1

我通过从其他一些源构建数据表并将其用作 GridView 的数据源来显示 GridView:

DataTable details = new DataTable();
details.Columns.Add("Name");
details.Columns.Add("Cost");
details.Columns.Add("Time");
foreach(Source s in MySource){
    DataRow detailRow = details.NewRow();
    detailRow["Id"] = 10;
    detailRow["Name"] = "test";
    detailRow["Cost"] = 10;
    detailRow["Time"] = s.GetSimplifiedTime();
    details.Rows.Add(detailRow);
}

myGrid.DataSource = details ;
myGrid.DataBind();

问题是:对于每一行,我需要为某些列保存一些附加数据(例如显示的

08/01/2023 10:23:11
的更精确时间
08/01
)。我在 RowSelecting 事件处理程序中需要这些数据。

我能得到的最接近的是添加额外的

DataKeys
列:(但是,这不是 DataKey 的目的,我已经使用
Id
作为我的唯一标识符。)

<asp:GridView ID="myGrid" DataKeyNames="ID, DetailedTime, FullName" runat="server" CssClass="table table-hover" AutoGenerateColumns="false"  OnSelectedIndexChanged="MyHandler">
    <Columns>
        <asp:CommandField HeaderText="Ship" ShowSelectButton="True" ButtonType="Button" ControlStyle-CssClass="btn btn-outline-success"/>
        <asp:BoundField DataField="Name" HeaderText="Name"></asp:BoundField>
        <asp:BoundField DataField="Cost" HeaderText="Cost"></asp:BoundField>
        <asp:BoundField DataField="Time" HeaderText="Due"></asp:BoundField>
    </Columns>
</asp:GridView>

我想知道是否还有其他方法可以实现为每一行添加附加数据? (更好的是为每个单元格添加数据,以分别访问显示名称和值,例如

Cells[0].Text
Cells[0].Value
)。

我正在使用 .NET Framework 4.8。

c# asp.net gridview
1个回答
0
投票

不太清楚为什么这里使用某些行选择事件?为什么不直接为给定的行添加一些复选框。然后让用户选中 2 行或说 12 行。

至于日期时间?您可以以任何您想要的格式显示时间/日期,但与所有日期时间一样,您当然可以存储完整的日期+时间值。

因此,日期时间将具有日期 + 时间。

因此,对于酒店预订日期,我可以有 2 列,一列用于显示日期,任何一列用于显示入住时间(均来自一个预订日期列)。

所以,说出这个标记:

<asp:GridView ID="GridView1" runat="server"
    AutoGenerateColumns="False" DataKeyNames="ID" CssClass="table"
    ShowFooter="true">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        <asp:BoundField DataField="Nights" HeaderText="Nights" ItemStyle-HorizontalAlign="Center" />
        <asp:BoundField DataField="Price" HeaderText="Price" DataFormatString="{0:c2}"
            ItemStyle-HorizontalAlign="Right" />

        <asp:TemplateField HeaderText="Total" ItemStyle-HorizontalAlign="Right">
            <ItemTemplate>
                <asp:Label ID="lblTotal" runat="server"
                    Text='<%# string.Format("{0:c2}", Eval("MyTotal")) %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Label ID="lblMyTotal" runat="server" Text="x">
                </asp:Label>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Date" ItemStyle-HorizontalAlign="Right" ItemStyle-Width="70px">
            <ItemTemplate>
                <asp:Label ID="lblDate" runat="server"
                    Text='<%# Eval("BookingDate","{0:MMM dd}") %>'></asp:Label>
            </ItemTemplate>
         </asp:TemplateField>
        <asp:TemplateField HeaderText="Check in" 
            ItemStyle-HorizontalAlign="Right" ItemStyle-Width="90px">
            <ItemTemplate>
                <asp:Label ID="lblCheckIn" runat="server"
                    Text='<%# Eval("BookingDate","{0:HH:mm tt}") %>'></asp:Label>
            </ItemTemplate>
         </asp:TemplateField>
        <asp:TemplateField HeaderText="Select" ItemStyle-HorizontalAlign="Center" >
            <ItemTemplate>
                <asp:CheckBox ID="chkSel" runat="server" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<br />
<asp:Button ID="cmdProcess" runat="server" Text="Process Selected"
    CssClass="btn"
    OnClick="cmdProcess_Click"
    />
    <asp:Label ID="lblSel" runat="server" Text="" style="margin-left:25px"  ></asp:Label>
    </div>

背后的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();
    }

    void LoadGrid()
    {
        DataTable rstData;
        string strSQL = 
            @"SELECT * FROM tblHotelsA WHERE Active = 1
            ORDER BY HotelName";

        rstData = General.MyRst(strSQL);

        DataColumn MyCol = new DataColumn("MyTotal", typeof(decimal));
        MyCol.Expression = "[Nights] * [Price]";
        rstData.Columns.Add(MyCol);

        GridView1.DataSource = rstData;
        GridView1.DataBind();

        // set up the footing total.
        decimal gTotal = 0;
        foreach (DataRow dr in rstData.Rows)
            gTotal += Convert.ToDecimal(dr["MyTotal"]);

        Label lblTotal = (Label)GridView1.FooterRow.FindControl("lblMyTotal");
        lblTotal.Text = String.Format("{0:C2}", gTotal);

    }

请注意上面的可爱技巧,其中有一列有一个“表达式”(计算)。很少有人意识到数据表中的列允许使用表达式,并且它们可以是其他列和值的组合,如上所示)。

所以,有了上面的内容,我们就明白了:

所以,从上面看:

我们使用了带格式的日期时间列。因此,获取日期、时间,甚至只是年份或任何允许人们更改显示与数据库中保存的实际日期时间值的内容。

在GridView中使用一个简单的复选框(未绑定),那么行选择处理变得相当容易,示例代码既建立了行索引列表,又建立了所选行的数据库PK列表。

并注意我们如何将基于其他列的表达式的列添加到数据表中。在本例中,我们根据“Nights X Price”创建了一个 MyTotal 列。

© www.soinside.com 2019 - 2024. All rights reserved.