3 votes

Obtenir la valeur de l'élément du ListView lors du selectedIndexChanged sur la Dropdownlist dans le ListView

J'ai un ListView et une DropDownList dans chaque rangée de ce ListView. Vous pouvez classer une personne assignée dans cette liste déroulante (la liste déroulante affiche les données d'une base de données MySql).

Lorsque je change de personne, je dois effectuer des opérations dans la base de données. Pour cela, j'ai besoin de savoir sur quelle rangée de ListView la personne a été modifiée et j'ai besoin de connaître la valeur de l'entrée.

Voici mon fichier aspx :

<asp:ListView ID="manageAssigneesListView" runat="server" DataKeyNames="" OnItemDataBound="OnDataBound">            
                <ItemTemplate>
                    <div class="summaryRow">
                        <asp:Label ID="customerId" runat="server"><%# Eval("customerId") %>&nbsp;</asp:Label>    
                        <div style="width:200px; margin: 0px 5px; float: left;"><%# Eval("lastName") %>, <%# Eval("firstName") %></div>
                        <div style="width:120px; margin: 0px 2px; float: left;">Nr.</div>
                        <div style="width:200px; margin-left: 50px; float: right;">
                            <asp:DropDownList runat="server" ID="selectAssignee" Width="196" AppendDataBoundItems="true" OnSelectedIndexChanged="selectAssignee_OnSelectedIndexChanged" AutoPostBack="true">
                            </asp:DropDownList>
                        </div>
                        <div class="clear"></div>
                    </div>
                </ItemTemplate>
            </asp:ListView>   

Voici mon code de base :

protected void Page_Load(object sender, EventArgs e)
    {
        Helper.doAuth(Session, Response);

        if (!IsPostBack)
        {
            // load all customers without assignee
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection con = new MySqlConnection();
            con.ConnectionString = Helper.CONNECTION_STRING;
            cmd.CommandText = "SELECT customerId, lastName, firstName, assignee FROM customer WHERE assignee IS NULL ORDER BY customerId DESC";
            cmd.Connection = con;
            con.Open();
            MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            manageAssigneesListView.DataSource = ds;
            manageAssigneesListView.DataBind();
            con.Close();

        }
    }

    protected void OnDataBound(object sender, ListViewItemEventArgs e)
    {
        DropDownList selectAssignee = (e.Item.FindControl("selectAssignee") as DropDownList);

        MySqlCommand cmd = new MySqlCommand();
        MySqlConnection con = new MySqlConnection();
        con.ConnectionString = Helper.CONNECTION_STRING;
        cmd.CommandText = "SELECT * FROM user where role = " + Helper.ROLE_SALESPERSON;
        cmd.Connection = con;
        con.Open();
        MySqlDataAdapter sda = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        selectAssignee.DataSource = ds;
        selectAssignee.DataTextField = "emailAdress";
        selectAssignee.DataBind();
        con.Close();    
    }

    protected void selectAssignee_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dropDownList = (DropDownList)sender;
        ListViewItem listView = (ListViewItem)dropDownList.NamingContainer;

        var test = listView.DataItem;
        string test2 = listView.FindControl("customerId").ToString();

        int rowIndex = (int)listView.DataItemIndex;
        Label lblMessage = (Label)listView.FindControl("customerId");
    }

J'ai réussi à obtenir le DataItemIndex de la rangée dont j'ai modifié la valeur dans la liste déroulante, et la liste déroulante se déclenche correctement lors de la modification de l'indice de sélection, mais ce dont j'ai besoin, c'est de la valeur de l'étiquette "customerId" et je ne sais pas comment obtenir cette valeur.

Merci d'avance

4voto

Tim Schmelter Points 163781

Vous devez utiliser FindControl pour obtenir la référence à la Label puis utilisez sa propriété Text :

ListViewItem item = (ListViewItem)dropDownList.NamingContainer;
Label lbltCustomerID = (Label) item.FindControl("customerId");
string customerID = lblCustomerID.Text;

D'ailleurs, le ListViewItem.DataItem est toujours null sur les postbacks.

Modifier :

Vous devez définir le Text de l'étiquette, donc au lieu de

<asp:Label ID="customerId" runat="server">
    <%# Eval("customerId") %>&nbsp;
</asp:Label>    

este

<asp:Label ID="customerId" runat="server"
   Text='<%# Eval("customerId") %>' >
</asp:Label>

1voto

Mohammad Fahmawi Points 155

Essayer de récupérer la valeur de l'étiquette directement à partir du ListView comme

        DropDownList dropDownList = (DropDownList)sender;
        ListViewItem listView = (ListViewItem)dropDownList.NamingContainer;

        var test = listView.DataItem;
        string test2 = listView.FindControl("customerId").ToString();

        int rowIndex = (int)listView.DataItemIndex;
        Label label = (Label)manageAssigneesListView.Items[rowIndex ].Controls[0];

ou

 Label label = (Label)manageAssigneesListView.Items[rowIndex].FindControl("customerId");

et assurez-vous que le ListView ne se lie pas à chaque fois lors du postback.

comme si le ListView était chargé sur PageLoad, n'oubliez pas de l'ajouter dans :

if (!IsPostBack)
    {
      //Load ListView
    }

1voto

Noman_1 Points 355

Même s'il s'agit d'une réponse, ma solution a bien fonctionné pour moi :

protected void myDdl_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList dropDownList = (DropDownList)sender;
        ListViewDataItem listView = (ListViewDataItem)dropDownList.NamingContainer;
        int rowIndex = listView.DataItemIndex;
        //Some logic
    }

Non pas que j'utilise ListViewDataItem au lieu de la solution de Peasmaker.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X