2010-01-29 3 views
2

d'abord:Comment ajouter l'article à Répéteur commande manuellement

  • _ddlOptions est liste déroulante
  • _selectedOptions est le contrôle répéteur

et il est juste code provisoire de mon contrôle final.

Ce que je veux faire est d'obtenir des données pour _ddlOption sur! IsPostBack. Un bouton Ajouter permet à l'utilisateur de déplacer l'élément déroulant sélectionné vers le contrôle du répéteur.

Il la façon suivante de mettre à jour Repeater.Items correct? J'ai trouvé beaucoup de solutions d'ajout/suppression d'éléments manuellement en utilisant DataSource, mais ici mon DataSource est nul, comme je l'ai mis seulement sur! IsPostBack.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      _ddlOptions.DataSource = new[] { 1, 2, 3 }; 
      _ddlOptions.DataBind(); 
     } 
    } 

    protected void OnAdd(object sender, EventArgs e) 
    { 
     var list = new ArrayList(_selectedOptions.Items); 
     list.Add(_ddlOptions.SelectedItem); 
     _ddlOptions.Items.RemoveAt(_ddlOptions.SelectedIndex); 
     _selectedOptions.DataSource = list; 
     _selectedOptions.DataBind(); 
    } 

Répondre

5

Si vous avez seulement besoin d'extraire des données et que vous allez utiliser viewstate, obtenez les données pour la première fois, stockez-les dans VS et récupérez-les dans VS pour tous les futurs PostBacks.

Exemple:

public List<int> Data 
    { 
     get 
     { 
      if (ViewState["Data"] == null) 
      { 
       // Get your data, save it and return it. 
       var data = new List<int> { 1, 2, 3 }; 
       ViewState["Data"] = data; 
       return data; 
      } 
       return (List<int>)ViewState["Data"]; 
     } 
     set 
     { 
      ViewState["Data"] = value; 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      BindData(Data); 
     } 
    } 

    private void BindData(List<int> data) 
    { 
     _ddlOptions.DataSource = data; 
     _ddlOptions.DataBind(); 
    } 

    protected void OnAdd(object sender, EventArgs e) 
    { 
     var existing = Data; 

     existing.Add(_ddlOptions.SelectedItem);       
     _ddlOptions.Items.RemoveAt(_ddlOptions.SelectedIndex); 

     Data = existing; 
     BindData(existing); 
    } 

Je n'ai pas testé cela - et sa seule ma première pensée mais vous pouvez tirer parti d'ici.

Patrick.

0

Vous pouvez utiliser un DataAdapter pour remplir une table dans un DataSet.

DataSet ds = new DataSet(); 

using (SqlConnection conn = YourConnectionFactory.GetConnection()) 
{ 
SqlCommand objComm = DBHelper.CreateStoredProc("YourStoredProcedure", 
conn); 
SqlDataAdapter adapt = new SqlDataAdapter(objComm); 
adapt.Fill(ds, TableName); 
conn.Close(); 
} 

DataTable dt = ds.Tables[0]; 
for (int a=dt.Rows.Count-1; a>= 0; a--) 
{ 
// check and insert as necessary 
} 

YourControl.DataSource = ds; 
YourControl.DataBind(); 

Vous pouvez aussi faire quelque chose comme ça alors, comme
REBIND Extrait de: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.aspx:

Dim values As New ArrayList() 
    values.Add(New PositionData("Microsoft", "Msft"))  
values.Add(New PositionData("Intel", "Intc"))  
values.Add(New PositionData("Dell", "Dell")) 
Repeater1.DataSource = values Repeater1.DataBind() 
Repeater2.DataSource = values Repeater2.DataBind() 
+0

Hmm, je pense qu'il vous manque un point. Je vais chercher des données seulement une fois sur IsPostBack et plus tard je ne vais pas stocker la source de données. J'utilise le mécanisme ViewState pour que les contrôles restaurent leur contenu. – dragonfly

0

me semble bon. Vous pouvez simplement déplacer la décalcification de votre liste en dehors de la méthode onAdd. Comme vous l'avez, je pense qu'il sera réinitialisé chaque fois que le bouton d'ajout est cliqué, de sorte que vous n'aurez jamais plus que l'élément actuellement sélectionné dans votre répéteur.

Questions connexes