Другой способ сделать это, чтобы избежать доступа к ячейкам GridView по индексу, - преобразовать желаемый BoundField в TemplateField в конструкторе. Затем используйте метод FindControl, чтобы получить текстовое значение в этой ячейке. По умолчанию дизайнер присваивает элементу управления Label нового TemplateField имя, например «Label1».
Я бы добавил несколько картинок, чтобы показать дизайнера, если бы этот процесс был проще. В любом случае, aspx изменится так, что вы можете сделать и вручную:
<asp:BoundField DataField="PurchaseOrderID" ...</asp:BoundField>
становится
<asp:TemplateField HeaderText="PurchaseOrderID">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("PurchaseOrderID") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PurchaseOrderID") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
Тогда вы сделаете это простое изменение кода:
string strPrimaryid = gvr.FindControl("Label1").Text;
Однако , я думаю, что лучший способ сделать это - использовать функции DataKeys элемента управления GridView. Первым шагом будет установка свойства DataKeyNames вашего GridView:
<asp:GridView ID="gvOrders" runat="server" DataKeyNames="PurchaseOrderID" ...>
Затем, предполагая, что ваш столбец PurchaseOrderID имеет тип int, вы должны изменить эту же строку на:
int primaryid = (int)gvOrders.DataKeys[gvr.RowIndex].Value;