2013-01-17 2 views
1

Bonjour les amis Je veux créer une liste générique personnalisée mon code est le suivant:Création personnalisée Liste générique en C#

public class Dates 
{ 
    string _FromDate; 
    string _ToDate; 

    public string FromDate 
    { 
     get { return _FromDate; } 
     set { _FromDate = value; } 
    } 

    public string ToDate 
    { 
     get { return _ToDate; } 
     set { _ToDate = value; } 
    } 
} 

protected void btnsearch_Click(object sender, EventArgs e) 
{ 

    DateTime start = new DateTime(2013,1,5); 
    DateTime end = new DateTime(2013,2,2); 

    string dayName = drpday.SelectedItem.ToString().ToLower(); 

    Dates dt = new Dates(); 
    List<Dates> list = new List<Dates>(); 
    int i = 0; 

    for (DateTime runDate = start; runDate <= end; runDate = runDate.AddDays(1)) 
    { 
     if (runDate.DayOfWeek.ToString().ToLower() == dayName) 
     { 
      dt.FromDate = runDate.ToShortDateString(); 
      dt.ToDate = (runDate.AddDays(double.Parse(hd_tourdays.Value)).ToShortDateString()); 
      list.Insert(i++,dt); 
     } 
    } 
    grd_TourDates.DataSource = list; 
    grd_TourDates.DataBind(); 
} 

dans ma liste résultante, il ne montre que dernier élément ajouté en boucle s'il vous plaît aider à résoudre le problème ..

+0

ce qui est variable dt, où est-il déclaré –

+0

En outre, ce sont '' start' et end' et où sont déclarés they? – Oded

+1

Pourquoi pas 'list.Add (dt);'? Où est 'list' déclaré? – Bridge

Répondre

3

Essayez ceci: ----

protected void btnsearch_Click(object sender, EventArgs e) 
    { 

     DateTime start = new DateTime(2013,1,5); 
     DateTime end = new DateTime(2013,2,2); 

     string dayName = drpday.SelectedItem.ToString().ToLower(); 

     Dates dt = new Dates(); 
     List<Dates> list = new List<Dates>(); 
     int i = 0; 

     for (DateTime runDate = start; runDate <= end; runDate = runDate.AddDays(1)) 
     { 
      if (runDate.DayOfWeek.ToString().ToLower() == dayName) 
      { 

       list.Add(new Dates{ 
         FromDate=runDate.ToShortDateString(); 
         ToDate=(runDate.AddDays(double.Parse(hd_tourdays.Value)).ToShortDateString()); 
    }); 

      } 
     } 
     grd_TourDates.DataSource = list; 
     grd_TourDates.DataBind(); 
    } 
+2

Juste pour clarifier ce que la solution réelle est ici. Le problème avec votre code d'origine est que vous réutilisez la référence * same * de 'Dates' à chaque fois, vous ne créez pas de * nouvelles * instances, donc quand il s'agit de lier un objet unique. C'est également la raison pour laquelle vous voyez le * dernier * élément de la liste. Cette solution a un code redondant 'Dates dt = new Dates()'. – James

+0

@Pushpendra - vous n'avez pas besoin de 'int i = 0;' - vous ne l'utilisez nulle part – Bridge

+0

@Bridge --- effectivement int i = 0 est utilisé par DharaPPatel je viens de copier son code et fait les changements. – Pushpendra

2

Modifier ceci:

protected void btnsearch_Click(object sender, EventArgs e) 
{ 
    Dates dt = new Dates(); 
    List<Dates> list = new List<Dates>(); 
    int i = 0; 

    for (DateTime runDate = start; runDate <= end; runDate = runDate.AddDays(1)) 
    { 
     if (runDate.DayOfWeek.ToString().ToLower() == dayName) 
     { 
      dt.FromDate = runDate.ToShortDateString(); 
      dt.ToDate = (runDate.AddDays(double.Parse(hd_tourdays.Value)).ToShortDateString()); 
      list.Insert(i++,dt); 
     } 
    } 
    grd_TourDates.DataSource = list; 
    grd_TourDates.DataBind(); 
} 

à cela et essayer:

protected void btnsearch_Click(object sender, EventArgs e) 
{ 
    Dates dt; 
    List<Dates> list = new List<Dates>(); 
    int i = 0; 

    for (DateTime runDate = start; runDate <= end; runDate = runDate.AddDays(1)) 
    { 
     if (runDate.DayOfWeek.ToString().ToLower() == dayName) 
     { 
      dt = new Dates() 
      dt.FromDate = runDate.ToShortDateString(); 
      dt.ToDate = (runDate.AddDays(double.Parse(hd_tourdays.Value)).ToShortDateString()); 
      list.Insert(i++,dt); 
     } 
    } 
    grd_TourDates.DataSource = list; 
    grd_TourDates.DataBind(); 
} 
+0

pourquoi -1 s'il vous plaît expliquer –

+0

J'ai la même chose, downvoted sans explication. Tous les paris que ce pourrait être le gars en bas qui a baissé à -5 (pas que je suis l'un de ceux qui les downvote)? – Bridge

+0

moi aussi, je ne downvote jamais avec des explications, nous sommes ici pour s'entraider –

1

La partie qui est à l'origine du problème est

Dates dt = new Dates(); 
for (.....) 
{ 
    dt.FromDate = ...; 
    dt.ToDate = ...; 
    list.Insert(i++,dt); 
} 

Vous utilisez une classe appelée Dates dans votre code, et en C# qui est a reference typ e. Vous créez une instance unique dans votre code et affectez la référence dt à la ligne Dates dt = new Dates();.
Dans la boucle, vous modifiez certaines propriétés de l'instance et ajoutez une référence à l'instance dans la liste. Ensuite, la boucle s'exécute à nouveau, et vous changez les propriétés de l'instance, changeant ainsi les valeurs d'instance pour la référence qui est déjà dans la liste, et vous ajoutez la même référence à la liste.
Les boucles continuent, comme le font les boucles, et cela se produit encore et encore, et il vous reste une liste contenant un tas de références à la même instance.

Donc les valeurs du list ne se ressemblent pas seulement, elles sont exactement la même chose. Pour résoudre ce problème, vous devez créer une nouvelle instance de la classe Dates chaque fois que vous devez ajouter une instance à la liste, avec un code comme celui-ci.

for (.....) 
{ 
    Dates dt = new Dates(); //creates a new reference to a new instance 
    dt.FromDate = ...;  //sets properties on the instance 
    dt.ToDate = ...; 
    list.Insert(i++,dt); // inserts a reference to the instance in the list 
} 
+0

merci @sweko pour expliquer :) – DharaPPatel

+0

Cela semble compliqué, mais il est évident une fois que vous grok le concept. – SWeko