Asp.net 数据键计数返回0
我在模板页上创建了一个母版页,并在其上放置了一个gridview。现在我将创建多个使用此母版页的页面aspx。我所要做的不是为这些aspx页面进行所有设置,而是配置一个数据源。当aspx加载时,它将数据源连接到母版页上的gridview并加载。现在我想在gridview中操作数据,但我的datakeys计数返回0。例如,我可以通过gv.Rowsdr.RowIndex.Cells5访问值。但我想通过数据键来实现。我的代码如下,任何帮助都将不胜感激。谢谢Asp.net 数据键计数返回0,asp.net,vb.net,gridview,page-lifecycle,Asp.net,Vb.net,Gridview,Page Lifecycle,我在模板页上创建了一个母版页,并在其上放置了一个gridview。现在我将创建多个使用此母版页的页面aspx。我所要做的不是为这些aspx页面进行所有设置,而是配置一个数据源。当aspx加载时,它将数据源连接到母版页上的gridview并加载。现在我想在gridview中操作数据,但我的datakeys计数返回0。例如,我可以通过gv.Rowsdr.RowIndex.Cells5访问值。但我想通过数据键来实现。我的代码如下,任何帮助都将不胜感激。谢谢 Public Sub ConnectData
Public Sub ConnectDataSource()
Dim mpContentPlaceHolder As ContentPlaceHolder
Dim gv As GridView
mpContentPlaceHolder = CType(Master.FindControl("GridViewPlaceHolder"), ContentPlaceHolder)
If Not mpContentPlaceHolder Is Nothing Then
gv = CType(mpContentPlaceHolder.FindControl("GridView1"), GridView)
If Not gv Is Nothing Then
Dim es As EntityDataSource = EntityDataSource1
gv.DataSource = es
gv.DataBind()
Debug.WriteLine("datakey count " + gv.DataKeys().Count.ToString())
' gv.HeaderRow.Cells(2).Text = "sdfds" // to change header text for each column.
End If
End If
End Sub
Private Sub PaymentRules_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim toolbarPlaceHolder As ContentPlaceHolder
Dim btn As ImageButton
toolbarPlaceHolder = CType(Master.FindControl("ToolBarPlaceHolder"), ContentPlaceHolder)
If Not toolbarPlaceHolder Is Nothing Then
btn = DirectCast(toolbarPlaceHolder.FindControl("ImageButton2"), ImageButton)
If Not btn Is Nothing Then
AddHandler btn.Click, AddressOf ImageButton2_Click
End If
End If
If (Not Page.IsPostBack) Then
ConnectDataSource()
End If
End Sub
Protected Sub ImageButton2_Click(sender As Object, e As EventArgs)
Debug.WriteLine("ImageButton2_Click")
Dim maList As New List(Of Integer)
Dim mContentPlaceHolder As ContentPlaceHolder
Dim gv As GridView
mContentPlaceHolder = CType(Master.FindControl("GridViewPlaceHolder"), ContentPlaceHolder)
If Not mContentPlaceHolder Is Nothing Then
gv = CType(mContentPlaceHolder.FindControl("GridView1"), GridView)
If Not gv Is Nothing Then
For Each dr As GridViewRow In gv.Rows
If ((TryCast(dr.FindControl("CheckBox1"), CheckBox)).Checked = True) Then
'Debug.WriteLine(dr.RowIndex.ToString())
'Dim id As Integer = gv.DataKeys(dr.RowIndex).Value
'maList.Add(id)
Debug.WriteLine("row index " + gv.Rows(dr.RowIndex).Cells(5).Text)
Debug.WriteLine("datakey count " + gv.DataKeys().Count.ToString())
End If
Next
End If
End If
End Sub
编辑-母版页代码
将ImageButtons、GridView和EntityDataSource从ContentPlaceHolde中取出。 您不需要使用FindControl,而是要选中复选框。
在GridView1中,将DataKeyNames属性设置为您的键。是否已在Gridview.aspx一侧设置DataKeyNames属性。检查下面的示例代码。如果您设置了DataKeyNames属性,那么只有我认为您才能访问代码隐藏中的DataKeys属性
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSource"
autogeneratecolumns="true"
emptydatatext="No data available."
autogenerateselectbutton="true"
datakeynames="CustomerID"
onselectedindexchanged="CustomersGridView_SelectedIndexChanged"
runat="server">
</asp:gridview>
你能详细说明一下吗。。为什么我必须这样做?我把它拿出来,仍然返回0!谢谢,但我想你不明白我的问题。使用刚才添加的代码。。我有,我说它能用。我想改为在gridview上使用数据键..您不需要使用FindControl来使用gridview,您只需要使用FindControl来处理复选框。无论如何,我可以在代码中设置,而不是直接在gridview上设置谢谢。。这就是缺少的。无论如何,我可以在代码隐藏中设置它,而不是直接在gridview上设置?
<asp:gridview id="CustomersGridView"
datasourceid="CustomersSource"
autogeneratecolumns="true"
emptydatatext="No data available."
autogenerateselectbutton="true"
datakeynames="CustomerID"
onselectedindexchanged="CustomersGridView_SelectedIndexChanged"
runat="server">
</asp:gridview>