2014-01-07 5 views
6

Я пытаюсь взять 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); 
    } 
} 

Затем, когда выбранные изменения индекса, нажав на эту увольняют, который я могу поставить точку останова на первой линии, и я вижу, что индекс я нажал на откладываются в. Однако, когда я добираюсь до foreach, он проскакивает прямо мимо него, потому что он показывает GridView1, имеющую граф из 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; 
} 
+0

Проблема, с которой я столкнулся с 'AutoGenerateSelectButton', это на самом деле помещает слово Select рядом со всем. Я просто хотел просто щелкнуть по нему, он делает то, что ему нужно для ответа. К сожалению, для GridView нет события onClick. –

+0

Да, извините. Я удалил свой комментарий, потому что я понял, от чтения вашего кода, что вы хотели иметь событие click во всей строке =) – jadarnel27

ответ

6

Постарайся просто захват строки из свойства SelectedRow:

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

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

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

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

Но это кажется немного Hacky.


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

+0

При попытке получить SelectedRow я получаю «GridView1.SelectedRow» бросил исключение типа «Система». ArgumentOutOfRangeException '"и" Index вне диапазона. Должен быть неотрицательным и меньше размера коллекции.Parameter name: index "В то же время, хотя GridView1.SelectedIndex имеет значение 4 в нем, что и есть то, что я ожидал бы. –

+1

@JohnWesleyGordon вы уверены, что '6' является надлежащим столбцом? Массив основан на нулевом значении, если вы выбрали столбец за пределами диапазона столбцов, он выкинул бы эту ошибку. – paqogomez

+0

@paqogomez Перед этим возникает ошибка. Не имеет значения, изменил ли я его на 'row.Cells [0] .Text;' –

Смежные вопросы