3

我有一个带有下拉列表的列的 Gridview。我已将此下拉列表与“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,因此此时标签应该有一个值。

你知道我怎样才能从另一列的标签中得到我需要的值吗?

谢谢大家。

4

2 回答 2

2

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

在任何情况下,以编程方式设置的数据源经常发生的情况是它们在 a 上消失PostBack,当你调用它时DataBind,你实际上是在将它 DataBinding 为 null,这可以解释为什么你得到string.Empty("") 为LabelText财产。

于 2013-07-08T19:33:02.267 回答
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 标记放在这里:

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

于 2013-07-10T11:21:02.460 回答