簡體   English   中英

訪問用於綁定 gridview 的數據或數據項

[英]Accessing the data or dataItem used to bind a gridview

我有一個 gridview,我以編程方式為其設置數據源並將其數據綁定到對象集合。 對於創建的每一行,我然后在字段中使用不同的方法從 object 中提取相關信息,如下所示:

<asp:TemplateField HeaderText="Aliases">
<ItemTemplate>
<%# ( (MyItem)Container.DataItem).Aliases.ToString() %>
</ItemTemplate>
</asp:TemplateField>

我的問題是,在OnRowDeleting方法中,我希望能夠使用例如MyGridView.Rows[e.RowIndex].DataItem或其他方式訪問該DataItem 但我找不到如何配置Gridview以保留DataItem 是否可以訪問使用的DataItem以及我將如何配置它來做到這一點? 如果那不可能,我可以訪問方法綁定的值嗎? 或者我是否必須使用計划 B go 並將數據源 object 集合重寫為數據表,然后使用數據鍵名稱?

MyGridView.Rows[e.RowIndex].DataItem通常應該可以工作,但我猜您可能依賴視圖狀態在回發時保留網格數據。 在這種情況下,您將獲得作為 NULL 的DataItem屬性。

解決方法可以是始終在頁面生命周期的早期(例如page_load )的每個回發中將網格與實際數據重新綁定。

但是,在您的情況下,您可以很好地使用DataKeyNames 與您的看法相反,您不需要 DataTable 來使此屬性起作用。 例如,如果您的 class 具有名為ItemId的屬性,指示您的 object 的密鑰,那么您可以在標記中使用DataKeyNames="ItemId"並在OnRowDeleting中使用事件 ZDBC11CAA5BDA29F77E6FB4DABD8 的Keys屬性引用它。

根據MSDN

“DataItem 屬性僅在 GridView 控件的 RowDataBound 事件期間和之后可用。”

因此,在 RowDataBound 事件中訪問 DataItem:

假設您將 List(Of Vehicle) 綁定到網格:

Dim vehicles As List(Of Vehicle) = Vehicle.GetAll()
gvVehicles.DataSource = vehicles
gvVehicles.DataBind()

在 RowDataBound 事件中訪問 DataItem:

Protected Sub gvVehicles_RowDataBound(sender As Object, e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then
       Dim veh As Vehicle = TryCast(e.Row.DataItem, Vehicle)
       If Not veh Is Nothing Then
            Dim chkBox As CheckBox = CType(e.Row.FindControl("chkSelect"), CheckBox)
                chkBox.Checked = True
       End If
    End If
End Sub

我知道此時這是一個非常過時的問題——但是,我剛剛遇到了一個類似的問題,這些答案都沒有解決這個問題; 所以我想我會發布一個替代解決方案。 在我的場景中,問題出在OnSelectedIndexChanged事件上。 因此,理論上它應該適用於OnRowDeleting但不一定適用於OnRowDeleted (取決於刪除行的過程中的確切位置)。

我的解決方案是簡單地為我不想在GridView中可見的數據添加一個HiddenField ,例如:

        <asp:GridView ID="gvTutorGroups" runat="server" AutoGenerateColumns="False" DataSourceID="sqlTutorGroups" DataKeyNames="TTGP_Group_Code" AllowPaging="True" PageSize="8" EmptyDataText="You have no tutor groups to display." Style="margin: 0 auto; width: 870px;" OnRowDataBound="gvTutorGroups_RowDataBound" OnSelectedIndexChanged="gvTutorGroups_SelectedIndexChanged">
            <Columns>
                <asp:TemplateField >
                    <ItemTemplate>
                        <asp:HiddenField runat="server" ID="hfTTGPISN" Value="<%# Eval("TTGP_ISN") %>" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="TTGP_Group_Code" HeaderText="TG Code" />
                <asp:BoundField DataField="PRPH_Title" HeaderText="Name" />
                <asp:BoundField DataField="TTGP_Start_Date" HeaderText="Start Date" DataFormatString="{0:d}" />
                <asp:BoundField DataField="TTGP_End_Date" HeaderText="End Date" DataFormatString="{0:d}" />
            </Columns>
        </asp:GridView>

然后我只使用FindControl方法訪問該字段,如下所示:

protected void gvTutorGroups_SelectedIndexChanged(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvTutorGroups.Rows)
    {
        if (row.RowIndex == gvTutorGroups.SelectedIndex)
        {
            row.CssClass = "rowSelected";

            DataRowView dataItem = (DataRowView)row.DataItem;
            HiddenField hfTGIsn = (HiddenField)this.Parent.FindControl("hfTGisn");
            hfTGIsn.Value = ((HiddenField)row.FindControl("hfTTGPISN")).Value;
        }
        else
        {
            row.CssClass = "";
        }
    }
}

這不是一個理想的解決方案,但它確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM