从Gridview中的下拉列中获取数据

时间:2013-07-08 18:44:47

标签: asp.net .net gridview

我有一个带有DropDownList的列的Gridview。 我已将此Dropdownlist与“SelectedIndexChanged”上的事件绑定在一起。 问题是我无法获得同一行中另一列标签的值。

代码是下一个:

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,因此标签此时应该有一个值。

您知道如何从另一栏中的标签中获得我需要的价值吗?

谢谢大家。

2 个答案:

答案 0 :(得分:2)

在执行DataSource之前检查GridView的DataBind()。由于您缺少完整的ASPX标记,我不确定您是以编程方式还是使用SqlDataSource设置数据源。

在任何情况下,以编程方式设置的数据源经常会发生的事情是它们会在PostBack上消失,而当您调用DataBind时,您实际上是DataBinding它为null,可以解释为什么你为string.Empty的{​​{1}}财产获得Label(“”)。

答案 1 :(得分:2)

刚刚验证了您提供的代码。它完全正常工作。 请确保在Grid View的RowDataBound事件中,重新连接下拉列表的SelectedIndexChanged事件,如下所示:

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 Markup:

<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标记以供检查。