我见过类似的问题,但没有一个答案帮助我解决了这个问题。 我有一个带有ReadOnly字段的GridView,如下所示。
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>
您可以看到prID
BoundField具有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;
}
注意:我已尝试使用GridView1.DataKeys[e.RowIndex]
和onRowDataBound
并仅在代码隐藏中设置BoundField,但我无法获得结果< / p>
提前致谢!
答案 0 :(得分:15)
我看到 GridView控件中的DataKeyNames设置是这样的
DataKeyNames="projectID"
然后我猜你的密钥名称是 projectID 而不是 prID ,不是吗? 如果是这样,您可以将所选行的数据作为此行:
string id = GridView1.DataKeys[e.RowIndex]["projectID"].ToString();
您还应该添加此列:
<asp:BoundField DataField="projectID" HeaderText="prID" SortExpression="projectID"/>
你试过吗?
换句话说,您可以尝试使用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>
此代码从GridView1_RowUpdating事件处理程序中的prID列获取数据:
Label lblPrId = row.FindControl("lblPrId") as Label;
string prId = lblPrId .Text;
很抱歉,如果这没有帮助。