3

DropDownList を持つ列を持つ 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実行する前に、GridView を確認してくださいDataBind()。完全な ASPX マークアップがないため、データ ソースをプログラムで設定しているのか、SqlDataSource を使用して設定しているのかわかりません。

いずれにせよ、プログラムで設定されたデータ ソースでよく発生するのは、 でそれらが消えることです。PostBackそれを呼び出すとDataBind、実際には null に DataBinding していることになりますstring.EmptyLabelTextプロパティ。

于 2013-07-08T19:33:02.267 に答える
2

提供されたコードを確認しました。それは完全に機能しています。グリッド ビューの 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 に答える