2013-07-08 4 views
3

У меня есть Gridview с колонкой с DropDownList. Я связал этот Dropdownlist с событием на «SelectedIndexChanged». Проблема в том, что я не могу получить значение метки другого столбца в той же строке.Получить данные из строки выпадающего списка в Gridview

Код следующий:

protected void grid_OnSelectedIndexChanged(object sender, EventArgs e) 
    { 
     grdCredenciales.DataBind(); 

     var dropdown = (DropDownList)sender; 
     var row = (GridViewRow)dropdown.NamingContainer; 
     var label = (Label)row.FindControl("lblMatricula"); 

     var value = label.Text; // I get "" in this line. 
    } 

И в сетке у меня есть:

<asp:ObjectDataSource ID="CredencialesDS" runat="server" /> 
<asp:GridView ID="grdCredenciales" runat="server" BackColor="White" DataSourceID="CredencialesDS" 
    CssClass="DDGridView" RowStyle-CssClass="td" HeaderStyle-CssClass="th" CellPadding="6" AllowSorting="True" 
    AllowPaging="True" AutoGenerateColumns="False" PageSize="10" OnRowDataBound="grdCredenciales_OnRowDataBound"> 
    <Columns> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <asp:Label ID="Label7" ToolTip="Matrícula" runat="server" Text="Matrícula"/> 
      </HeaderTemplate> 
      <HeaderStyle HorizontalAlign="Left" Width="15%"/> 
      <ItemStyle HorizontalAlign="Left" /> 
      <ItemTemplate> 
       <asp:Label ID="lblMatricula" runat="server"><%# Eval("Matricula") %></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField> 
      <HeaderTemplate> 
       <asp:Label ID="Label19" ToolTip="Estado" runat="server" Text="Estado" /> 
      </HeaderTemplate> 
      <HeaderStyle HorizontalAlign="Left" Width="15%"/> 
      <ItemStyle HorizontalAlign="Left" /> 
      <ItemTemplate> 
       <asp:DropDownList runat="server" ID="dpEstadoCredencial" AutoPostBack="True" OnSelectedIndexChanged="grid_OnSelectedIndexChanged" CssClass="comboEstado"/> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

Я не знаю, почему, но label.text возвращает пустую строку. Как вы можете видеть, я вызываю DataBind раньше, поэтому метка должна иметь значение в этот момент.

Вы знаете, как я могу получить значение, которое мне нужно, от метки в другом столбце?

Спасибо всем.

+0

Можете ли вы показать свое определение сетки? Кроме того, попробуйте label.Name, он будет содержать значение, если метка отображается и не определена, сообщите мне, работает ли она для вас, и я составу полный ответ. –

+0

Я добавил код aspx. Проверьте это! –

+1

О, спасибо за помощь. PD: Лейбл не имеет свойства «Имя». –

ответ

2

Проверьте DataSource GridView, прежде чем делать DataBind(). Поскольку вам не хватает полной разметки ASPX, я не уверен, что вы устанавливаете источник данных программно или с помощью SqlDataSource.

В любом случае, что часто случается с программно заданными источниками данных, это то, что они исчезают на PostBack, и когда вы называете это DataBind, вы действительно привязываете его к NULL, что объясняет, почему вы получаете string.Empty ("") для LabelText Недвижимость.

+0

Спасибо, Гаррисон, это очень полезно. Но знаете ли вы, как я могу получить нужные мне данные? –

+0

Ваш код выглядит так, как будто он будет работать, чтобы предоставить вам данные в 'value', которые вы ожидаете, но это не сработает, если вы являетесь DataBinding на' null', как я подозреваю. Давайте проверим это. Поместите точку останова на 'grdCredenciales.DataBind();', затем запустите код и проверьте значение grdCredenciales.DataSource или DataSourceID. Если оба являются пустыми или пустыми, ваш вызов 'DataBind()' нарушает вашу логику. Вы можете попробовать не выполнять 'DataBind()' в начале, но это не гарантирует его исправление. –

+0

Я проверил его. DataSource имеет значение NULL, но значение DataSourceID имеет значение! (имя источника данных). Если я еще не делал привязку данных, это не сработает. –

2

Просто подтвержденный код предоставленный вами. Он работает полностью. Пожалуйста, убедитесь, что в случае RowDataBound в Grid View, вы снова прикрепить SelectedIndexChanged событие в DropDownList, как показано ниже:

protected void CustomersGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (Page.IsPostBack) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       DropDownList ddl = e.Row.FindControl("dropdown1") as DropDownList; 
       if (ddl != null) 
       { 
        ddl.SelectedIndexChanged += new EventHandler(CustomersGridView_SelectedIndexChanged); 
       } 
      } 
     } 
    } 

Кроме того, я использовал тот же код, как у вас в SelectedIndexChanged случае. Я помещаю здесь мой Aspx Разметка:

<asp:gridview id="CustomersGridView" 
     datasourceid="CustomersSqlDataSource" 
     autogeneratecolumns="false" 

     runat="server" 
     OnRowDataBound="CustomersGridView_RowDataBound"> 
      <Columns> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:Label runat="server" ID="Label2" Text='<%# Bind("ID") %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:DropDownList ID="dropdown1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dropdown1_SelectedIndexChanged"> 
          <asp:ListItem Text="Cat"></asp:ListItem> 
          <asp:ListItem Text="dog"></asp:ListItem> 
          <asp:ListItem Text="Mouse"></asp:ListItem> 
          <asp:ListItem Text="pig"></asp:ListItem> 
          <asp:ListItem Text="snake"></asp:ListItem> 
         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 

     </asp:gridview> 

Пожалуйста, укажите свой GridView разметку слишком для проверки.

+0

Спасибо за ваш ответ. Событие привязано правильно, моя проблема в том, что при вызове метода на «SelectedIndexChanged» я не могу получить значение другой метки в той же строке. Я отредактировал сообщение, и я добавил разметку GridView. Проверьте это! Надеюсь, вы сможете помочь! Большое спасибо –

+1

ok. Таким образом, вы используете ObjectDataSource. Из последнего обновления, сделанного вами в разделе «Разметка», я вижу, что некоторые атрибуты отсутствуют для ObjectDataSource. 1.) TypeName, 2.) SelectMethod. Чтобы работать с ObjectDataSource, создайте класс, содержащий класс DataAccess Methods и еще один класс, который предоставляет все поля вашей таблицы как общедоступные. Убедитесь, что строка подключения в порядке. Сообщите мне, нужен ли вам код файлов классов, если он может вам помочь. –

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