2017-08-17 3 views
-1

Je souhaite ajouter de nouveaux éléments à ma liste générique lorsque l'utilisateur clique sur un bouton, mais lorsque je clique sur le bouton, je vois que la liste ne contient que le dernier élément introduit. Il semble que lors de chaque bouton, la liste de clic soit réinitialisée. Comment puis-je conserver les anciens éléments et ajouter de nouveaux éléments à ma liste générique et les afficher tous dans la liste?Comment ajouter de nouveaux éléments et les conserver dans une liste générique après chaque clic sur un événement?

Merci ..

C# Code

namespace Example 
{ 
    /// <summary> 
    /// Interaction logic for CreateProduct.xaml 
    /// </summary> 
    public partial class CreateProduct : Window 
    { 
     public static float weight; 
     public static int quantity; 
     public static string customer, piece, material; 

     public CreateProduct() 
     { 
      InitializeComponent(); 

     } 

     public static List<Liste> AddList() 
     { 
      List<Liste> list = new List<Liste>(); 
      Liste kayit= new Liste(); 

      kayit.Customer = customer; 
      kayit.Piece = piece; 
      kayit.Material = material; 
      kayit.Quantity = quantity; 
      kayit.Weight = weight; 

      list.Add(kayit); 

      return list;   
     } 

     private void btnAdd_Click(object sender, RoutedEventArgs e) 
     { 
      customer = btnEditCustomer1.Text; 
      piece = btnPiece.Text; 
      material = txtMaterial.Text; 
      quantity = Convert.ToInt32(txtQuantity.Text); 
      weight = float.Parse(txtWeight.Text); 

      if (customer != null && piece != null && material != null) 
      { 
       listBoxProduct.ItemsSource = AddList(); 
      } 
     } 
    } 

    public class Liste 
    { 
     public string Customer { get; set; } 
     public string Piece { get; set; } 
     public string Material { get; set; } 
     public int Quantity { get; set; } 
     public float Weight { get; set; } 
    }  
} 

XAML code

<ListBox Grid.Row="1" x:Name="listBoxProduct" SelectionMode="Single" Margin="0" Background="Transparent" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Hidden" Height="200"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border BorderThickness="1" Margin="0" Height="30" CornerRadius="4" Width="875" Background="#2E323B" BorderBrush="Black"> 
       <DockPanel> 
        <TextBlock Text="{Binding Customer}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Stretch" FontSize="16" HorizontalAlignment="Left" Margin="4,0,0,0"/> 
        <TextBlock Text="{Binding Piece}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Stretch" FontSize="16" HorizontalAlignment="Left" Margin="4,0,0,0"/> 
        <TextBlock Text="{Binding Material}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Stretch" FontSize="16" HorizontalAlignment="Left" Margin="4,0,0,0"/> 
        <TextBlock Text="{Binding Quantity}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Stretch" FontSize="16" HorizontalAlignment="Left" Margin="4,0,0,0"/> 
        <TextBlock Text="{Binding Weight}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Stretch" FontSize="16" HorizontalAlignment="Left" Margin="4,0,0,0"/> 
       </DockPanel> 
      </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

essayez d'utiliser l'anglais comme classe et les noms de propriété, il est un peu difficile à comprendre qui est qui – Kokombads

+0

Il semble que vous nouveau pour WPF (il est normal). Mais il peut être difficile de comprendre tous les conseils que vous obtenez. Donc, je pense que vous pouvez mieux apprendre avec "mode conversation" étape par étape. Il y a une salle de discussion impressionnante (https://chat.stackoverflow.com/rooms/18165/wpf) pour les discussions relatives à wpf (pas seulement). –

Répondre

2

fixer quelques problème avec votre code:

  • éviter static lorsque cela est possible
  • ne créent pas une nouvelle instance de la liste sur chaque clic, vous perdez les éléments précédents. déclare un champ dans une fenêtre.
  • listBox a besoin de savoir lorsque de nouveaux éléments sont ajoutés pour les afficher. mais List ne signale pas les ajouts/suppressions. utiliser ObservableCollection
public partial class CreateProduct : Window 
{ 
    private ObservableCollection<Liste> list = new ObservableCollection<Liste>();  

    public CreateProduct() 
    { 
     InitializeComponent(); 
     listBoxProduct.ItemsSource = list; 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     float weight; 
     int quantity; 
     string customer, piece, material; 

     customer = btnEditCustomer1.Text; 
     piece = btnPiece.Text; 
     material = txtMaterial.Text; 
     quantity = Convert.ToInt32(txtQuantity.Text); 
     weight = float.Parse(txtWeight.Text); 

     if (customer != null && piece != null && material != null) 
     { 
      Liste kayit = new Liste(); 

      kayit.Customer = customer; 
      kayit.Piece = piece; 
      kayit.Material = material; 
      kayit.Quantity = quantity; 
      kayit.Weight = weight; 

      list.Add(kayit); 
     } 
    } 
} 
+0

Merci beaucoup @ ASh. Cela fonctionne très bien. Je découvre ObservableCollection grâce à vous. – Barsblue

0

On dirait que votre code est complètement foiré. Quoi qu'il en soit, laissez-moi vous donner une solution rapide qui fonctionnera pour vous.

static List<Liste> list = new List<Liste>(); 

public static List<Liste> ListeEkle() 
{ 

    Liste kayit= new Liste(); 

    kayit.Musteri = musteri; 
    kayit.Parca = parca; 
    kayit.Malzeme = malzeme; 
    kayit.Adet = Adet; 
    kayit.Agirlik = Agirlik; 

    list.Add(kayit); 

    return list; 


} 

Espérons que ça aide.

+0

Merci mon ami.Mais ça ne marche pas.Il ne fonctionne qu'une seule fois.Mais quand je clique sur le bouton, rien ne se passe d'autre. – Barsblue

+0

@Baris Vous devez supprimer la création 'list' de la méthode' ListeEkle' et la garder en dehors de la méthode comme mentionné. – Gopichandar

0

Vous recréez la liste avec un seul élément à chaque clic de bouton, car la méthode AddList réinitialise la liste (elle crée une nouvelle liste à chaque fois). La liste doit être créée en dehors de la méthode AddList (et en dehors du gestionnaire d'événements click click). Dans l'AddList, vous devez créer un élément (Liste) et l'ajouter à la liste existante, comme indiqué par la réponse de @ Gopichandar.

Vous pouvez également envisager d'utiliser une liaison (unidirectionnelle) de la liste dans la zone de liste plutôt que de recréer le ItemSource de la liste à chaque clic.

+0

Merci. J'ai essayé mais je ne peux pas gérer. Pouvez-vous écrire plus explicatif? – Barsblue

1

Le problème est que votre AddList() crée une nouvelle liste à chaque clic sur un bouton. Vous devez créer une nouvelle propriété par exemple:

public ObservableCollection<Liste> AllItems { get; set; } = new ObservableCollection<Liste>(); 

et après que le changement de votre AddList()

public static Liste CreateItem() 
{ 
    Liste kayit= new Liste(); 

    kayit.Customer = customer; 
    kayit.Piece = piece; 
    kayit.Material = material; 
    kayit.Quantity = quantity; 
    kayit.Weight = weight; 

    return kayit; 
} 

et votre btnAdd_Click() à

private void btnAdd_Click(object sender, RoutedEventArgs e) 
{ 
    customer = btnEditCustomer1.Text; 
    piece = btnPiece.Text; 
    material = txtMaterial.Text; 
    quantity = Convert.ToInt32(txtQuantity.Text); 
    weight = float.Parse(txtWeight.Text); 

    if (customer != null && piece != null && material != null) 
    { 
     AllItems.Add(CreateItem()); 
    } 
} 

Alors maintenant CreateItem() votre ancien AddList() va créer un nouvel article et cet article sera ajouté à votre collection dans la méthode btnAdd_Click.

Edit:

Ce que je manqué de dire est que vous devez définir le ItemSource dans le constructeur.

public CreateProduct() 
{ 
    InitializeComponent(); 
    listBoxProduct.ItemsSource = AllItems; 
} 

SiteNOTE:

je changerais tout votre btnAdd_Click Méthode à ceci:

private void btnAdd_Click(object sender, RoutedEventArgs e) 
{ 
    string customer = btnEditCustomer1.Text; 
    string piece = btnPiece.Text; 
    string material = txtMaterial.Text; 
    int quantity = Convert.ToInt32(txtQuantity.Text); 
    float weight = float.Parse(txtWeight.Text); 

    if (customer != null && piece != null && material != null) 
    { 
     var item = new Liste 
         { 
          Customer = customer, 
          Piece = piece, 
          Material = material, 
          Quantity = quantity, 
          Weight = weight 
         }; 

     AllItems.Add(item); 
    } 
} 
+0

Merci beaucoup Martin. – Barsblue