2017-05-03 11 views
2

この質問が以前に尋ねられた場合はお詫びしますが、私はコンボボックスをクリックすると本質的に私の頭を浮かべるほど近くです。リストボックス(All、Pizza、Burger、Sundry)をフィルタリングする4つのオプションがあります。 、Burger、およびSundryはカテゴリ名に含まれる単語です。どのようにして、リストボックスにコンボボックスで選択されているものだけが表示されるようにするのですか?リストボックスの項目をコンボボックスでフィルタリングするにはどうすればよいですか?

class InventoryItem 
{ 

     public string CategoryName { get; set; } 
     public string FoodName { get; set; } 
     public double Cost { get; set; } 
     public double Quantity { get; set; } 

     public override string ToString() 

    { 
     return $"{CategoryName} - {FoodName}. Cost: {Cost:0.00}, Quantity: {Quantity}"; 

    } 


} 

public partial class MainWindow : Window 
{ 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 


    private void inventoryButton_Click(object sender, RoutedEventArgs e) 
    { 
     InventoryWindow wnd = new InventoryWindow(); 

     //Var filepath allows the code to access the Invenotry.txt from the bin without direclty using a streamreader in the code 
     var filePath = "inventory.txt"; 

     if (File.Exists(filePath)) 
     { 
      // ReadAllLines method can read all the lines from the inventory.text file and then returns them in an array, in this case the InventoryItem 
      var fileContents = File.ReadAllLines(filePath); 
      foreach (var inventoryLine in fileContents) 
      { 

       // This makes sure our line has some content with a true or false boolean value, hence continue simply allows the code to continue past the if statment 
       if (string.IsNullOrWhiteSpace(inventoryLine)) continue; 

       //We can now Split a line of text in the inventory txt into segments with a comma thanks to the inventoryLine.Split 
       var inventoryLineSeg = inventoryLine.Split(','); 
       var inventoryItem = new InventoryItem(); 

       // if the code was succesful in trying to parse the text file these will hold the value of cost and quantity 
       double cost; 
       double quantity; 

       // Assign each part of the line to a property of the InventoryItem 
       inventoryItem.CategoryName = inventoryLineSeg[0]; 
       if (inventoryLineSeg.Length > 1) 
       { 
        inventoryItem.FoodName = inventoryLineSeg[1]; 
       } 
       if (inventoryLineSeg.Length > 2 & double.TryParse(inventoryLineSeg[2], out cost)) 
       { 
        inventoryItem.Cost = cost; 
       } 
       if (inventoryLineSeg.Length > 3 & double.TryParse(inventoryLineSeg[3], out quantity)) 
       { 
        inventoryItem.Quantity = quantity; 
       } 


       //Now able to add all the InventoryItem to our ListBox 
       wnd.ListBox.Items.Add(inventoryItem); 
      } 
      wnd.ShowDialog(); 

     } 
    }  
    private void foodMenuButton_Click(object sender, RoutedEventArgs e) 
    { 
     FoodMenuWindow wnd = new FoodMenuWindow(); 
     wnd.ShowDialog(); 
    } 

    private void newOrderButton_Click(object sender, RoutedEventArgs e) 
    { 
     OrderWindow wnd = new OrderWindow(); 
     wnd.ShowDialog(); 
    } 

    private void completedOrdersButton_Click(object sender, RoutedEventArgs e) 
    { 
     CompletedOrdersWindow wnd = new CompletedOrdersWindow(); 
     wnd.ShowDialog(); 
    } 

    private void quitButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.Close(); 
    } 
} 

}あなたがlineを分割する必要があります

+0

は '文字列のクイック検索を行います。 Split() '関数を呼び出すと単純な修正がオーバーロードされます – MethodMan

+0

最後のforeachには問題があります...あなたは' DLL'(各項目は 'x')の項目を繰り返していますが、同じ 'line'を追加します。 'x'を追加する必要があります。 –

答えて

0

あなたは明示的にテキストファイルからすべての行を読み込み、配列にそれらを返すFileクラスの静的ReadAllLines方法を、使用してStreamReaderを使用せずにこれを行うことができます。

クラスのstatic 'Splitメソッドを使用すると、1つ以上の文字列を分割します(あなたの場合はコンマを使用します)、配列内の項目を返します。

次に、分割線の内容に基づいて新しいInventoryItemを生成することができます。私は配列の長さを毎回テストするのが好きです。ちょうどコンマがない行があると例外が発生しません(言い換えれば、配列内のインデックスにアクセスしようとしないでください存在する)。

最後に、新しいInventoryItemListBoxに追加できます。

注:これはあなたのようなInventoryItemクラスを持っている前提としています

class InventoryItem 
{ 
    public string CategoryName { get; set; } 
    public string FoodName { get; set; } 
    public double Cost { get; set; } 
    public double Quantity { get; set; } 
    public override string ToString() 
    { 
     return $"{CategoryName} ({FoodName}) - Price: ${Cost:0.00}, Qty: {Quantity}"; 
    } 
} 

その後、我々はファイルを解析し、そのように私たちのListBoxを更新することができます。

// Path to our inventory file 
var filePath = @"f:\public\temp\inventory.txt"; 

if (File.Exists(filePath)) 
{ 
    var fileContents = File.ReadAllLines(filePath); 

    foreach (var inventoryLine in fileContents) 
    { 
     // Ensure our line has some content 
     if (string.IsNullOrWhiteSpace(inventoryLine)) continue; 

     // Split the line on the comma character 
     var inventoryLineParts = inventoryLine.Split(','); 
     var inventoryItem = new InventoryItem(); 

     // These will hold the values of Cost and Quantity if `double.TryParse` succeeds 
     double cost; 
     double qty; 

     // Assign each part of the line to a property of the InventoryItem 
     inventoryItem.CategoryName = inventoryLineParts[0].Trim(); 
     if (inventoryLineParts.Length > 1) 
     { 
      inventoryItem.FoodName = inventoryLineParts[1].Trim(); 
     } 
     if (inventoryLineParts.Length > 2 && 
      double.TryParse(inventoryLineParts[2], out cost)) 
     { 
      inventoryItem.Cost = cost; 
     } 
     if (inventoryLineParts.Length > 3 && 
      double.TryParse(inventoryLineParts[3], out qty)) 
     { 
      inventoryItem.Quantity = qty; 
     } 

     // Add this InventoryItem to our ListBox 
     wnd.ListBox.Items.Add(inventoryItem); 
    } 
} 
+0

あなたが読んで理解できる唯一のコードはありがたいですが、問題は残っていますが、動作するはずですが、何らかの理由でリストボックスの各行を表示する代わりにACW2.MainWindow + InventoryItem、なぜそれが分かりますか? – Carlos

+0

ああ、私はそれが 'InventoryItem'の文字列値を表示するデフォルトの方法を持っていないからだと思います。上記のコードサンプルを更新して、 'ToString'メソッドのオーバーライドを追加しました。あなたはあなたが望む方法を表示するように調整することができます。 –

+0

ありがとうございました! – Carlos

3

は、区切り,に読まれています。

var array = line.Split(','); 

あなたはインデックスarray[2] & array[3]で番号にアクセスすることができます。

double firstNumber = double.Parse(array[2]); 
double secondNumber = double.Parse(array[3]); 
関連する問題