Две идеи:
Во-первых, вы можете использовать поля шаблона для ваших столбцов и назвать элемент управления
держа ваши данные. Содержимое этих элементов управления можно затем извлечь следующим образом: ((TextBox)e.Row.FindControl("TextBoxProductName")).Text
Шаблон будет выглядеть примерно так:
<asp:TemplateField HeaderText="Product Name">
<EditItemTemplate>
<asp:TextBox ID="TextBoxProductName" runat="server" Text='<%# Bind("Product_Name") %>'/>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="LabelProductName" runat="server" Text='<%# Bind("Product_Name") %>'/>
</ItemTemplate>
</asp:TemplateField>
Обратите внимание также, что, поскольку вы привязываете данные сетки к представлению сетки вручную, в событии RowEditing (не RowUpdating), инициируемом кнопкой редактирования, вы должны установить индекс редактирования сетки просмотра. Попробуйте:
gvShowComm.EditIndex = e.Row.RowIndex;
Или, во-вторых, вы можете иметь более одного ключа данных в
вид сетки. Попробуйте что-то вроде:
DataKeyNames="Product_ID,Product_Name,Product_Price"
Эти значения затем могут быть получены следующим образом:
gvShowComm.DataKeys[e.RowIndex]["Product_Name"]
Следует отметить, что DataKeys действительно предназначены только для хранения первичных ключей БД. Использование их для чего-либо еще - взлом. Тем не менее, я иногда нуждался в этом, когда мне нужно было сохранить некоторую информацию для каждой строки, но я не хочу, чтобы она была видимой для пользователя.
Последнее замечание: не помещайте привязку данных в загрузку страницы, если вы не помещаете ее в условное выражение, которое запускается только при начальной загрузке страницы, а не при каждой обратной передаче. Пример: if (! IsPostback) ...