【问题标题】:How to find datakey value of gridview on selected index changed property?如何在选定的索引更改属性上查找 gridview 的数据键值?
【发布时间】:2015-02-23 03:03:43
【问题描述】:

我的 gridview 是这样的,但是当我选择视图按钮以查找所选索引上的主键值列已更改时出现错误。请帮我解决问题。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
            <Columns >
                <asp:TemplateField >
                    <ItemTemplate >
                        <asp:Button ID="btnViewComments" Text ="View Comments" runat ="server" CommandName ="select" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField ="forumId" Visible ="false" />
                <%--<asp:CommandField ButtonType ="Button" ShowSelectButton ="true" SelectText ="View Comments"/>--%>
                <asp:TemplateField HeaderText ="Question">
                    <ItemTemplate >
                        <asp:TextBox ID ="txtQuestion" Text ='<%#Eval("question")%>' runat ="server" TextMode ="MultiLine" Height="100" Width ="350"></asp:TextBox>
                       <%-- <%#Eval("question")%>--%>
                    </ItemTemplate>
                    <%--<EditItemTemplate >
                        <asp:TextBox ID ="txtQuestion" Text ='<%#Eval("question")%>' runat ="server" TextMode ="MultiLine" ></asp:TextBox>
                    </EditItemTemplate>--%>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Poster Name">
                    <ItemTemplate >
                        <%#Eval("posterName") %>
                    </ItemTemplate>
                    <EditItemTemplate >
                        <asp:Label ID ="lblPosterName" Text ='<%#Eval("posterName") %>' runat ="server" ></asp:Label>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Date">
                    <ItemTemplate >
                        <%#Eval("dateTim") %>
                    </ItemTemplate>
                    <EditItemTemplate >
                        <asp:Label ID ="lblDateTime" Text ='<%#Eval("dateTim") %>' runat ="server" ></asp:Label>
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
            <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
            <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
            <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
            <EditRowStyle BackColor="#999999" />
            <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
        </asp:GridView>

我的代码是.....

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            Int64 forumId = (Int64)GridView1.SelectedValue;
            Session["forumId"] = forumId;
            Response.Redirect("Thread.aspx");
        }
        catch (Exception)
        {

            throw;
        }
    }

【问题讨论】:

  • 出现以下错误......................................数据键必须在可以检索所选数据键之前在 GridView 'GridView1' 上指定。使用 DataKeyNames 属性指定数据键。

标签: c# asp.net


【解决方案1】:

首先,您必须在网格视图声明中定义要创建数据键的字段名称。例如,如果你想要 "forumId" datakey.than

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
DataKeyNames="forumId">

你可以通过这种方式访问​​

int intforumid = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Values[0]);

【讨论】:

    【解决方案2】:
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            Int64 forumId = Convert.ToInt64(GridView1.SelectedRow.Cells[1].Text);
            Session["forumId"] = forumId;
            Response.Redirect("Thread.aspx");
        }
        catch (Exception)
        {
    
            throw;
        }
    }
    

    【讨论】:

      【解决方案3】:

      看来你只需要将DataKeyNames属性设置为forumId就好了;

      <asp:GridView DataKeyNames = "forumId" ...
      

      【讨论】:

        【解决方案4】:

        您可以将DataKeyNames 设置为forumId,如下所示

        <asp:GridView ID="GridView1" runat="server" DataKeyNames = "forumId" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
        

        由于您在当前解决方案中没有提供任何数据键名称GridView1.SelectedValue 将不包含您期望的值

        【讨论】:

          【解决方案5】:

          您需要在网格视图中指定唯一的列名,以便在 Datakey 选项卡下设置。

          从那里,您需要在后台代码中调用 _selectedIndexChanged 方法。

          【讨论】:

            【解决方案6】:

            如果您没有在 page.cs 代码中使用 gridview 选择事件,那么您只需从 gridview 页面的 aspx 代码中删除 OnSelectedIndexChanged="GridView1_SelectedIndexChanged"。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-09-17
              • 1970-01-01
              相关资源
              最近更新 更多