При использовании GridView SelectedIndex всегда равен 0 при использовании пользовательской кнопки выбора.

При нажатии кнопки выбора в gvSquid2 x получает допустимое и правильное значение. При нажатии кнопки выбора в gvSquid я получаю исключение ArgumentOutOfRange, потому что gv.SelectedIndex=0. Кроме того, gv.SelectedDataKey имеет значение null. Как мне получить информацию DataKey? Помещение его в столбец недопустимо, так как оно должно быть скрыто от пользователя. Скрывать столбец бесполезно, потому что во время DataBind() значение отбрасывается. Я скопировал этот пример с веб-сайта Microsoft. Что мне не хватает?

<asp:gridview ID="gvSquid2" DataSourceID="dsComments" AutoGenerateColumns="false" AutoGenerateSelectButton="true" DataKeyNames="ID" OnSelectedIndexChanged="gvSquid_SelectedIndexChanged" runat="server" EnableViewState="false">
    <Columns>
        <asp:BoundField DataField="Date" ReadOnly="true" HeaderText="Date" SortExpression="Date" />
        <asp:BoundField DataField="Comment" ReadOnly="true" HeaderText="Comment" SortExpression="Comment" />
        <asp:BoundField DataField="Username" ReadOnly="true" HeaderText="User" SortExpression="Username" />
    </Columns>
</asp:gridview> 

<asp:gridview ID="gvSquid" DataSourceID="dsComments" AutoGenerateColumns="false" DataKeyNames="ID" OnSelectedIndexChanged="gvSquid_SelectedIndexChanged" runat="server" EnableViewState="false">
  <Columns>
    <asp:CommandField ButtonType="Image" HeaderText="Select" ShowSelectButton="true" SelectImageUrl="~/includes/RedX.jpg" />
    <asp:BoundField DataField="Date" ReadOnly="true" HeaderText="Date" SortExpression="Date" />
    <asp:BoundField DataField="Comment" ReadOnly="true" HeaderText="Comment" SortExpression="Comment" />
    <asp:BoundField DataField="Username" ReadOnly="true" HeaderText="User" SortExpression="Username" />
  </Columns>
</asp:gridview> 

protected void gvSquid_SelectedIndexChanged(object sender, EventArgs e) {
    string x;
    x = gvSquid.DataKeys[gvSquid.SelectedIndex].Value.ToString();
} 

person Slogmeister Extraordinaire    schedule 20.11.2013    source источник


Ответы (2)


Попробуйте использовать SelectedRow представления сетки, чтобы перейти к RowIndex, например:

protected void gvSquid_SelectedIndexChanged(object sender, EventArgs e) 
{
    string x;
    GridViewRow theGridViewRow = gvSquid.SelectedRow;
    x = gvSquid.DataKeys[theGridViewRow.RowIndex].Value.ToString();
} 
person Karl Anderson    schedule 20.11.2013
comment
gvSquid.SelectedRow.RowIndex = 0, поэтому я все еще получаю исключение ArgumentOutOfRange. Если на то пошло, gvSquid.DataKeys.Count=0, похоже, я теряю все, что связано с DataKey. - person Slogmeister Extraordinaire; 21.11.2013

Я понял. EnableViewState="true" должен быть установлен. Как только я изменил это, внезапно появились DataKeys.

Этот вопрос помог.

person Slogmeister Extraordinaire    schedule 21.11.2013