Pido disculpas si ya se ha hecho esta pregunta, pero estoy tan cerca de entenderlo, esencialmente, cuando hago clic en el cuadro combinado, me da 4 opciones para filtrar el cuadro de lista (Todo, Pizza, Hamburguesa, Varios) Pizza, Hamburguesa , y Varios son palabras que están en el nombre de la categoría. ¿Cómo hago para que mi cuadro de lista muestre solo lo que está seleccionado en el cuadro combinado?

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

}

2
Carlos 3 may. 2017 a las 18:30

2 respuestas

La mejor respuesta

Puede hacerlo sin utilizar explícitamente un StreamReader utilizando el método File clase 'static ReadAllLines, que lee todas las líneas de un archivo de texto y las devuelve en una matriz.

Luego, para cada línea, puede usar el método string clase 'static Split, que dividirá la línea en uno o más caracteres (usaremos una coma en su caso) y devolverá los elementos en una matriz

A continuación, podemos generar un nuevo InventoryItem basado en el contenido de las líneas divididas. Me gusta probar la longitud de la matriz cada vez, solo para que no lleguemos a una excepción si hay una línea que falta algunas comas (en otras palabras, no intente acceder a un índice en la matriz a menos que lo sepa existe).

Finalmente, podemos agregar nuestra nueva InventoryItem a nuestra ListBox.

Nota: esto supone que tiene una clase InventoryItem como:

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}";
    }
}

Luego podemos analizar el archivo y actualizar nuestro ListBox así:

// 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
Rufus L 3 may. 2017 a las 18:03

Deberá dividir el line que se lee en el delimitador ,.

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

Luego puede acceder a los números en el índice array[2] y array[3].

double firstNumber = double.Parse(array[2]);
double secondNumber = double.Parse(array[3]);
3
Ousmane D. 3 may. 2017 a las 15:43