Récupérer la valeur d'un dropdownlist créer dynamiquement dans un gridview

Résolu
cs_laurent19 Messages postés 6 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 7 septembre 2010 - 6 sept. 2010 à 14:09
cs_laurent19 Messages postés 6 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 7 septembre 2010 - 7 sept. 2010 à 10:11
Bonjour,

Voilà, je rencontre un petit soucis dans le développement de ma page web.
Voici ce que je cherche à obtenir.
Je récupère d'une base de données divers informations liés à des utilisateurs.
je renseigne un gridview avec ces infos
Chaque utilisateur à une ligne dans ce gridview qui peut contenir une ou plusieurs infos dans une seul colonne. ex:
User 1 | Group | CC UK | Edit
| Country | UK |
------------------------
User 2 | Country | FR | Edit
------------------------
Etc...
Un user = 1 ligne(row) dans le grid view.
Au bout de chaque ligne, les boutons delete/edit
lors d'un edit, je modifie la colonne des infos en remplaçant les label qui les contient par un dropdownlist (modification faite dans mon RowDataBound uniquement pour la ligne sélectionnée). Chaque liste déroulante est independante des autres.
Pour créer ces dropdownlist dynamiquement, je les créé (new dropwonlist) dans un placeholder placé dans le EditTemplate de mon gridview.

problème rencontré: lors de mon RowUpdating, il ne retrouve pas les éléments contenus dans mon placeholder, ni aucune des valeurs sélectionner dans les dropdownlist.(element is null)

J'ai donc contourner ça en créant une arraylist dans laquelle j'insère mes dropdownlist.
Dans le databound de mon grid view, je renseigne les placeholders de mes cellules editer avec les dropdownlist nécessaire.
J'en profite pour placer le curseur des dropdownlist sur une valeur remonté de la base de données.

Truc amusant mais chi%%t, le rowupadating du datagrid, retrouve bien le dropdownlist mais avec la valeur sélectionnée lors du databound et non pas celle sélectionnée par l'utilisateur.
J'ai l'impression que lors du databound, il met à jour le dropdownlist de l'array list et renvoi celui ci lors de l'update de la ligne.

Voici une partie du code:
protected void gvwExistingRight_RowDataBound(object sender, GridViewRowEventArgs e)
    {
      //if (e.Row.RowType DataControlRowType.DataRow && (e.Row.RowState & DataControlRowState.Edit) DataControlRowState.Edit)
      if (e.Row.RowType == DataControlRowType.DataRow)
      {
 
        PlaceHolder phrGridObject = (PlaceHolder)e.Row.FindControl("phrGridObject");
        PlaceHolder phrGridValue = (PlaceHolder)e.Row.FindControl("phrGridValue");
 
        if (phrGridObject != null && phrGridValue != null)
        {
          DataTable tableFactObj = new DataTable();
 
          Label lblAppliId = (Label)e.Row.FindControl("lblAppId");
          Label lblRuleId = (Label)e.Row.FindControl("lblRuleId");
 
          string stringfunction "SELECT F.OBJ_ID,O.OBJ_LBL_ID, O.OBJ_DDL_ID, VAL_ID FROM GAP_DAT_FACT F, GAP_REF_OBJECT O WHERE USR_ID '" + hfdUserId.Value + "' AND F.[APP_ID]='" + lblAppliId.Text + "' AND FAC_RULE_ID ='" + lblRuleId.Text + "' AND F.OBJ_ID = O.OBJ_ID ORDER BY F.OBJ_ID";
          SqlDataReader rdr = CreateReader(stringfunction);
          tableFactObj.Load(rdr);
          rdr.Close();
        
          foreach (DataRow r in tableFactObj.Rows)
          {
 
            foreach (Object o in ArrayListObjectDdl)
            {  
              DropDownList dropdownlistAttribut = o as DropDownList;
              if (dropdownlistAttribut.ID == r[2].ToString())
              {
                dropdownlistAttribut.SelectedValue = r[3].ToString();
                Literal literal2 = new Literal();
                literal2.Text = "
";
                phrGridValue.Controls.Add(dropdownlistAttribut);
                phrGridValue.Controls.Add(literal2);
 
              }
            }
          }
          tableFactObj.Dispose();
          tableFactObj.Reset();
        }
        
      }
    }
 
 protected void gvwExistingRight_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
 
      DataTable tableFactObj = new DataTable();
 
      Label lblAppId = (Label)gvwExistingRight.Rows[e.RowIndex].FindControl("lblAppId");
      Label lblRuleId = (Label)gvwExistingRight.Rows[e.RowIndex].FindControl("lblRuleId");
 
      string stringfunction "SELECT F.OBJ_ID, O.OBJ_DDL_ID, F.VAL_ID FROM GAP_DAT_FACT F, GAP_REF_OBJECT O WHERE USR_ID '" + hfdUserId.Value + "' AND F.[APP_ID]='" + lblAppId.Text + "' AND FAC_RULE_ID ='" + lblRuleId.Text + "' AND F.OBJ_ID = O.OBJ_ID ORDER BY F.OBJ_ID";
      SqlDataReader rdr = CreateReader(stringfunction);
      tableFactObj.Load(rdr);
      rdr.Close();
 
      foreach (DataRow r in tableFactObj.Rows)
      {
 
        foreach (Object o in ArrayListObjectDdl)
        {
          DropDownList dropdownlistAttribut = o as DropDownList;
          
          if (dropdownlistAttribut.ID == r[1].ToString() && dropdownlistAttribut.SelectedValue != r[2].ToString())
          {
            TextBox tbxCalGridrStart = (TextBox)gvwExistingRight.Rows[e.RowIndex].FindControl("tbxCalGridrStart"); //textbox Start Date
            TextBox tbxCalGridrEnd = (TextBox)gvwExistingRight.Rows[e.RowIndex].FindControl("tbxCalGridrEnd");   //textbox End Date
            String UpdateDate = DateTime.Today.Year + "-" + DateTime.Today.Month + "-" + DateTime.Today.Day;    // Mettre ici la date de mise a jour
 
            stringfunction = UpdateFact(hfdUserId.Value, lblAppId.Text.ToString(), lblRuleId.Text.ToString(), r[0].ToString(), dropdownlistAttribut.SelectedValue.ToString(), tbxCalGridrStart.Text.ToString(), tbxCalGridrEnd.Text.ToString(), UpdateDate);
            SqlDataReader Fac_id = CreateReader(stringfunction);
            Fac_id.Read();
            stringfunction = LogInsertFact(Fac_id[0].ToString(), "UPDATE");
            InsertReader(stringfunction);
          }
        }
      }
      tableFactObj.Dispose();
      tableFactObj.Reset();
 
      gvwExistingRight.EditIndex = -1;
      LoadDataGrid(hfdUserId.Value);
    }

La question serai donc:

Comment mettre à jour l'arraylist avec la valeur sélectionnée par l'utilisateur puis mettre à jour la table en cliquant sur le rowupdating ?

Ou Plus simple, comment récupérer la valeur sélectionnée par l'utilisateur sans que cela ne mettent à jour l'arraylist ?

Voilà, si vous avez la moindre piste à me donner, cela m'aiderai beaucoup.

En vous remerciant par avance.

<--- Sore wa himitsu desu --->

1 réponse

cs_laurent19 Messages postés 6 Date d'inscription jeudi 5 février 2004 Statut Membre Dernière intervention 7 septembre 2010
7 sept. 2010 à 10:11
C'est bon, j'ai trouvé,

Merci à ceux qui ont cherché.
J'utilise un repeater dans mon DataBound de cette façon:
Repeater rprGridView = (Repeater)e.Row.FindControl("rprGridView");
// permet de créer une collection d'entier quiservira de datasource [0, ..., n]
                    IEnumerable data = Enumerable.Range(0, tableFactObj.Rows.Count);
                    rprGridView.DataSource = data;
                    rprGridView.DataBind();
int loop = 0;
                        foreach (RepeaterItem item in rprGridView.Items)
                        {
                            if (parseObject == loop)
                            {
                                if (item.ItemType ListItemType.Item || item.ItemType ListItemType.AlternatingItem)
                                {
                                    DropDownList ddlRepeater = item.FindControl("ddlRepeater") as DropDownList;
                                    stringfunction = GetFildList(r[0].ToString());
                                    rdr = CreateReader(stringfunction);
                                    rdt.Load(rdr);
                                    rdr.Close();
 
                                    HiddenField hfdRepeater = item.FindControl("hfdRepeater") as HiddenField;
                                    hfdRepeater.Value = r[2].ToString();
 
                                    //Insertion des valeurs dans la ddl
                                    ddlRepeater.DataSource = CreateDataView2();
                                    ddlRepeater.DataTextField = "TextField";
                                    ddlRepeater.DataValueField = "ValueField";
                                    ddlRepeater.DataBind();
                                    ddlRepeater.Visible = true;
                                    ddlRepeater.SelectedValue = r[3].ToString();
 
                                    rdt.Dispose();
                                    rdt.Reset();
                                }                                
                            }
                            loop += 1;                            
                        }
                        parseObject += 1;

Et hop ca marche.
C'est magique ce truc !!

<--- Sore wa himitsu desu --->
3
Rejoignez-nous