Asp.net 数据键计数返回0

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

我在模板页上创建了一个母版页,并在其上放置了一个gridview。现在我将创建多个使用此母版页的页面aspx。我所要做的不是为这些aspx页面进行所有设置,而是配置一个数据源。当aspx加载时,它将数据源连接到母版页上的gridview并加载。现在我想在gridview中操作数据,但我的datakeys计数返回0。例如,我可以通过gv.Rowsdr.RowIndex.Cells5访问值。但我想通过数据键来实现。我的代码如下,任何帮助都将不胜感激。谢谢

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>