如何从代码隐藏中的GridView访问选定的边界值

Poo*_*rya 4 c# asp.net gridview code-behind readonly

我见过类似的问题,但没有一个答案帮助我解决了这个问题.我有一个带有ReadOnly字段的GridView,如下所示.

网格视图:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
              AutoGenerateColumns="False" DataKeyNames="projectID" 
              DataSourceID="SqlDataSource1" 
              EmptyDataText="There are no data records to display." 
              PageSize="5" OnRowUpdating="GridView1_RowUpdating">
  <Columns>
    <asp:CommandField ShowDeleteButton="True" ShowEditButton="True"/>
    <asp:BoundField DataField="prID" HeaderText="prID" SortExpression="prID"/>
    <asp:BoundField DataField="projectName" HeaderText="projectName" 
                    SortExpression="projectName" />
    <asp:BoundField DataField="projectType" HeaderText="projectType" 
                    SortExpression="projectType" />
  </Columns>
  <EditRowStyle CssClass="GridViewEditRow"/>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,prIDBoundField具有Readonly=True属性.prID当用户更新行中的其他字段时,我正试图获取代码隐藏的值.

后台代码:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{

    GridViewRow row = GridView1.Rows[e.RowIndex];

    String d1 = ((TextBox)(row.Cells[2].Controls[0])).Text;
    String d2 = ((TextBox)(row.Cells[3].Controls[0])).Text;

    // this only works while the field is not readonly      
    string prIDUpdate = ((TextBox)(row.Cells[1].Controls[0])).Text; 

}
Run Code Online (Sandbox Code Playgroud)

注意:我已经尝试过使用,GridView1.DataKeys[e.RowIndex]并且onRowDataBound只在代码隐藏中设置了BoundField就绪,但我无法获得结果

提前致谢!

Ali*_*ice 15

我看到GridView控件中的DataKeyNames设置是这样的

DataKeyNames="projectID"
Run Code Online (Sandbox Code Playgroud)

然后我猜你的关键名是projectID而不是prID,不是吗?如果是这样,您可以获取所选行的数据作为此行:

string id = GridView1.DataKeys[e.RowIndex]["projectID"].ToString();
Run Code Online (Sandbox Code Playgroud)

您还应该添加此列:

<asp:BoundField DataField="projectID" HeaderText="prID" SortExpression="projectID"/>
Run Code Online (Sandbox Code Playgroud)

你试过吗?

换句话说,您可以尝试使用TemplateField

<Columns>
            <asp:TemplateField HeaderText="prID" SortExpression="prID">
                <ItemTemplate>
                    <asp:Label ID="lblPrId" runat="server" Text='<%# Bind("prID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="projectName" HeaderText="projectName" 
                    SortExpression="projectName" />
            <asp:BoundField DataField="projectType" HeaderText="projectType" 
                    SortExpression="projectType" />
  </Columns>
Run Code Online (Sandbox Code Playgroud)

此代码从GridView1_RowUpdating事件处理程序中的prID列获取数据:

Label lblPrId = row.FindControl("lblPrId") as Label;    
string prId = lblPrId .Text;
Run Code Online (Sandbox Code Playgroud)

对不起,如果这没有帮助.