Щелкните GridView, найдите выбранную строку.

Я пытаюсь взять GridView и вернуть данные из строки, по которой щелкнули. Я пробовал приведенный ниже код, и когда я щелкаю строку, я возвращаю выбранный индекс, но когда я смотрю на фактические строки в GridView, они отображаются пустыми. Не уверен, что мне не хватает.

.ASP сделать мою сетку.

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True" 
        CssClass="datatables" Width="100%" 
        DataSourceID="SqlDataSource1" 
        GridLines="None" ShowFooter="True" AllowSorting="True"  
        onrowcreated="GridView1_RowCreated" 
        onrowdatabound="GridView1_RowDataBound" ShowHeaderWhenEmpty="True" 
        onrowcommand="GridView1_RowCommand" 
        onselectedindexchanged="GridView1_SelectedIndexChanged">
        <HeaderStyle CssClass="hdrow" />
        <RowStyle CssClass="datarow" />
        <PagerStyle CssClass="cssPager" />
</asp:GridView>

В каждой привязке данных строки я удостоверяюсь, что щелчок должен установить выбранный индекс.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
     if (e.Row.RowType == DataControlRowType.DataRow)
     {
        e.Row.Attributes["onclick"] = Page.ClientScript.GetPostBackClientHyperlink(GridView1, "Select$" + e.Row.RowIndex);
     }
 }

Затем, когда выбранный индекс изменяется, щелкнув, это запускается, и я могу поставить точку останова в первой строке, и я вижу, что индекс того, что я щелкнул, сохраняется в a. Однако, когда я добираюсь до foreach, он пропускает его, потому что показывает, что GridView1 имеет Count 0 строк. Теоретически он должен иметь пару сотен строк, и когда индекс совпадает, он должен захватить данные в 6-й ячейке и сохранить их в строке b. Почему я не получаю строк по клику?

 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
 {
            int a = GridView1.SelectedIndex

            foreach (GridViewRow row in GridView1.Rows)
            {
                if (row.RowIndex == a)
                {
                    b = row.Cells[6].Text;
                }
            }
 }

Вот моя загрузка страницы.

protected void Page_Load(object sender, EventArgs e)
{
      c = HttpContext.Current.Session["c"].ToString();
      SqlDataSource1.ConnectionString = //My secret
      string strSelect = "SELECT columnnames from tablenames where c in (@c)
      SqlDataSource1.SelectParameters.Clear();
      SqlDataSource1.SelectCommand = strSelect;
      SqlDataSource1.SelectParameters.Add("c", c);
       try
        {
            GridView1.DataBind();
        }
        catch (Exception e)
        {

        }
        GridView1.AutoGenerateColumns = true;
}

person John Wesley Gordon    schedule 07.01.2014    source источник
comment
Проблема, с которой я столкнулся с AutoGenerateSelectButton, заключается в том, что слово Select ставится рядом со всем. Я просто хотел просто щелкнуть по нему, он делает то, что ему нужно для ответа. К сожалению, для GridView нет события onClick.   -  person John Wesley Gordon    schedule 08.01.2014
comment
Да, извините за это. Я удалил свой комментарий, потому что, прочитав ваш код, понял, что вы хотите, чтобы событие щелчка было для всей строки =)   -  person Josh Darnell    schedule 08.01.2014


Ответы (1)


Попробуйте просто взять строку из свойства SelectedRow:

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow row = GridView1.SelectedRow;
    string b = row.Cells[6].Text;
}

Насколько я понимаю, коллекция Rows не повторно заполняется в PostBacks, когда вы используете эти элементы управления источниками данных (например, SqlDataSource).

Вероятно, вы могли бы использовать свой существующий код, если бы вы вызвали .DataBind() в своем GridView перед попыткой выполнить итерацию по строкам:

GridView1.DataSourceID="SqlDataSource1";
GridView1.DataBind();

Но это кажется немного хакерским.


Увидев ваш Page_Load, я вижу, что вам нужно обернуть код привязки данных в блок if(!Page.IsPostBack). Привязка данных при каждой обратной передаче прерывает процесс ASP.NET, поддерживающий состояние ваших элементов управления через ViewState.

person Josh Darnell    schedule 07.01.2014
comment
При попытке получить SelectedRow я получаю «GridView1.SelectedRow», выдает исключение типа «System.ArgumentOutOfRangeException», а индекс находится вне допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: index В то же время GridView1.SelectedIndex имеет в нем значение 4, чего я и ожидал. - person John Wesley Gordon; 08.01.2014
comment
@JohnWesleyGordon, вы уверены, что 6 - это правильный столбец? Массив основан на нуле, если вы выберете столбец за пределами диапазона столбцов, это вызовет эту ошибку. - person crthompson; 08.01.2014
comment
@paqogomez Перед этим выдает ошибку. Неважно, поменяю ли я его на row.Cells[0].Text; - person John Wesley Gordon; 08.01.2014
comment
Кажется, что на вашей странице должно быть что-то еще, кроме @John. Вы пробовали хакерское решение, о котором я упоминал в своем посте (поместив эти две строки кода вверху исходного события SelectedIndexChanged)? - person Josh Darnell; 08.01.2014
comment
Я только что снова попытался сделать GridView1.DataBind(), и это сработало. Я не знаю, нравится ли мне это, потому что, если что-то изменилось между первой привязкой данных и этой новой привязкой данных, я не выберу правильную строку. Если данные были Боб, Фрэнк, Джон, и я выбираю Фрэнка, если я снова привяжу данные и данные вернутся как Боб, Карл, Фрэнк, Джон, разве я не получу ответ, что выбрал Карла? - person John Wesley Gordon; 08.01.2014
comment
Хммм, это интересный сценарий, @John. Я не думаю, что операция привязки данных повлияет на SelectedValue, но вы всегда можете попробовать и посмотреть. Я согласен, однако, что это не оптимально. Изменили ли вы какие-либо значения по умолчанию в отношении ViewState? И выполняете ли вы какую-либо обработку (связанную с сеткой или динамическими элементами управления) в ранних событиях жизненного цикла страницы (загрузка, инициализация, предварительная визуализация, предварительная инициализация и т. д.)? - person Josh Darnell; 08.01.2014
comment
Никаких изменений в ViewState. Я создаю запрос и привязку данных в первый раз для этого GridView изначально на Page_Load - person John Wesley Gordon; 08.01.2014
comment
@John Не могли бы вы добавить свой код Page_Load к вопросу? Вы делаете все это в блоке if(!Page.IsPostBack) (так что это происходит только при начальной загрузке страницы)? Поскольку вы используете SqlDataSource, я просто предположил, что вы вообще не выполняли привязку данных вручную в своем отделенном коде. - person Josh Darnell; 08.01.2014
comment
@John, не стесняйтесь зайти в этот чат, если вы хотите говорить в режиме реального времени. - person Josh Darnell; 08.01.2014