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

  • Question

  • 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 | Info 1
    | Info 2
    User 2 | Info 1
    Etc...
    Un user = 1 ligne(row) dans le grid view.
    Au bout de chaque ligne, les bouton 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)
    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 = "<br />";
                    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.

    lundi 6 septembre 2010 10:24

Réponses

  • 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<int> 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 !!
    • Marqué comme réponse LaurentGir mardi 7 septembre 2010 08:09
    mardi 7 septembre 2010 08:09