2017-08-17 1 views
-1

Ich möchte neue Elemente zu meiner generischen Liste hinzufügen, wenn der Benutzer auf eine Schaltfläche klickt, aber wenn ich auf die Schaltfläche klicke, sehe ich, dass die Liste nur das zuletzt eingeführte Element enthält. Es scheint, dass während jeder Schaltfläche Klick-Liste neu initialisiert werden. Wie kann ich alte Elemente behalten und neue Elemente zu meiner generischen Liste hinzufügen und alle in der Listbox anzeigen?Wie können neue Elemente hinzugefügt und vorherige Elemente in einer allgemeinen Liste nach jedem Klickereignis beibehalten werden?

Danke ..

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

versuchen, es ist ein bisschen schwer zu verstehen, was was ist – Kokombads

+0

Es ist wie Sie WPF neu erscheint (es ist in Ordnung). Aber es kann schwer sein, alle Ratschläge zu verstehen, was man bekommt. Also, ich denke du kannst besser mit "Chat-Modus" Schritt für Schritt lernen. Es gibt tolle [Chatroom] (https://chat.stackoverflow.com/rooms/18165/wpf) für relative WPF (nicht nur) Diskussionen. –

Antwort

2

einige Probleme mit Ihrem Code zu beheben:

  • vermeiden static wenn möglich
  • Erstellen Sie keine neue Instanz von List bei jedem Klick, Sie verlieren vorherige Elemente. ein Feld in einem Fenster deklarieren.
  • listBox muss wissen, wenn neue Elemente hinzugefügt werden, um sie anzuzeigen. aber List berichtet nicht über Ergänzungen/Entfernungen. Englisch als Ihre Klasse und Eigenschaftsnamen verwenden 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

Vielen Dank @ ASh.Es funktioniert ausgezeichnet.Ich entdecke ObservableCollection dank Ihnen. – Barsblue

0

Scheint, wie ist Ihr Code völlig durcheinander. Wie auch immer, lass mich eine schnelle Lösung geben, die für dich funktioniert.

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; 


} 

Hoffe, dass hilft.

+0

Vielen Dank mein Freund. Aber es funktioniert nicht. Es funktioniert nur einmal. Aber wenn ich auf den Knopf klicke, passiert nichts anderes. – Barsblue

+0

@Baris Sie müssen die 'list' Kreation aus der' ListeEkle' Methode entfernen und sie wie erwähnt von der Methode fernhalten. – Gopichandar

0

Sie erstellen die Liste mit einem einzelnen Element bei jedem Klick neu, da die AddList-Methode die Liste neu initialisiert (sie erstellt jedes Mal eine neue Liste). Die Liste muss außerhalb der AddList-Methode (und außerhalb des Button-Click-Ereignishandlers) erstellt werden. In der AddList sollten Sie ein Element (Liste) erstellen und es nur zur vorhandenen Liste hinzufügen, wie in der Antwort von @ Gopichandar angegeben.

Sie können auch eine (unidirektionale) Bindung der Liste an die Listbox in Erwägung ziehen, anstatt die ItemSource der Listbox bei jedem Klick neu zu erstellen.

+0

Danke.Ich habe versucht, aber ich kann es nicht schaffen.Kannst du mehr erläutern? – Barsblue

1

Das Problem ist, dass Ihre AddList() erstellt eine neue Liste bei jedem Klick auf die Schaltfläche. Sie haben eine neue Eigenschaft zum Beispiel erstellen:

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

und danach Ihre 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; 
} 

und Ihre btnAdd_Click() zu

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()); 
    } 
} 

So, jetzt ein CreateItem() alten AddList() wird erstellen ändern Der neue Artikel und dieser Artikel werden Ihrer Sammlung innerhalb der btnAdd_Click-Methode hinzugefügt.

Edit:

Was vermisste ich sage ist, dass Sie die ItemSource im Konstruktor gesetzt haben.

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

SiteNote:

Ich würde Ihre ganze btnAdd_Click Methode Um dies zu ändern:

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

Vielen Dank Martin. – Barsblue

Verwandte Themen