Как найти индекс строки относительно datakey в GridView asp.net

У меня есть элемент управления gridview, в котором включена подкачка страниц, у меня есть значение datakey, я хочу найти индекс строки относительно значения datakey, у меня есть этот код,

protected int GetRowIndex(object userID)
{
  for(int i = 0l i <= GridView1.DataKey.Count -1 ; i++)
  {
    if(GridView1.DataKey[i].Value == userID)
    {
       return i;
    }   

  }

}

но есть проблема с этим кодом, что, если этот идентификатор пользователя не найден на этой странице, он вернет 0, мой вопрос заключается в том, как я могу изменить индекс страницы, чтобы найти строку на всех страницах. Я использую собственную страницу просмотра gridview.

3 ответа

    private static int IndexOfGridView(GridView gridView, int dataKeyId, int index)
    {
        foreach (GridViewRow gvRow in gridView.Rows)
        {
            var dataKey = gridView.DataKeys[gvRow.DataItemIndex];
            if (dataKey == null || (int)dataKey.Value != dataKeyId) continue;
            index = gvRow.DataItemIndex;
            break;
        }
        return index;
    }

Для этого нет прямой поддержки, потому что GridView не хранит все DataKeys где-то для поиска. Он сохраняет только набор DataKeys, которые он использует для текущей страницы. Изменение индекса страницы не приводит к автоматической "загрузке" DataKeys для этой страницы, так что вы можете выполнять поиск по каждой из них.

Вам нужно будет решить эту проблему, добавив функцию, которая при получении идентификатора пользователя вернет страницу для отображения. Он может быть назван GetPageFromUserID(объект userID). Эта функция должна будет искать в вашем хранилище данных, используя тот же порядок сортировки, размер страницы и условия фильтрации, что и в вашей сетке.

Даже с этим индексом страницы, который вы установите в свойстве GridView.PageIndex, вам все равно придется вызывать DataBind() для GridView, чтобы заставить его загружать строки (и DataKeys) из базы данных, чтобы Вы можете использовать код выше, чтобы найти индекс строки.

Вы можете найти индекс строки в GridView с помощью:

rowIndex = theGridView.DataKeys.IndexOf(theDataKeyValue)

Я нашел это в старом проекте ASP.net VB, который мы все еще поддерживаем, надеюсь, это поможет.

string user_id = GridView1.SelectedDataKey["userID"].ToString();

Здесь вы получаете идентификатор пользователя выбранных данных в виде сетки.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
          DataKeyNames="userID" OnRowDataBound="GridView1_RowDataBound"
                OnSelectedIndexChanged="GridView1_SelectedIndexChanged" >

   <asp:CommandField ShowSelectButton="True"> </asp:CommandField>

    // write code

  </asp:GridView>

Если вы используете концепцию Pagination в Gridview, лучше сделать это в самом бэкенде, тогда вам будет проще отображать данные, т.е. вы будете принимать 10 данных за раз, нажимая на первую страницу, как мудрое... та же концепция, что и в ретрансляторе, легко сравнить с gridview...

Другие вопросы по тегам