[英]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.