winforms 我需要显示用户输入的条形码的相应数据

nxagd54h  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(102)

这个程序很简单,但我似乎不能理解它><
因此,用户必须在第一个文本框中写入条形码,并在第二个文本框中写入产品,然后在单击添加按钮后将这两个保存到数组列表中。则下一部分是搜索栏,其中用户搜索条形码,并且该搜索框下方的标签应当显示条形码的对应产品。
我想我的每一个陈述都有一个错误。我只能在产品文本框中显示现有数据。
请帮助

private void btn_add_Click(object sender, EventArgs e)
        {
            int barcode = Convert.ToInt32(txt_barcode.Text);
            barcodeList.Add(barcode);

            string product = txt_product.Text;
            productList.Add(product);

            MessageBox.Show("saved");
        }

        private void txt_search_TextChanged(object sender, EventArgs e)
        {
            try
            {
                int barcodeSearch = Convert.ToInt32(txt_search.Text);

                    for (int count = 0; count < barcodeList.Count; count++)
                    {
                        foreach (int barcode in barcodeList)
                        {
                            if (barcodeSearch == barcode)
                            {
                                foreach (string product in productList)
                                {
                                    lbl_product.Text = "" + product;
                                }
                            }
                        }
                    }   
            } catch (Exception ex)
            {
                
            }
        }
9nvpjoqh

9nvpjoqh1#

你试图从一个基于其他无序列表的无序列表中检索一个项目。您可以使用索引来实现这一点,但这是笨拙、复杂和容易出错的。
我建议使用Dictionary,它存储基于key的项目,因此您可以轻松检索它们。

var productDictionary = new Dictionary<string, string>();

添加到它:

productDictionary[txt_barcode.Text] = txt_product.Text;

并检索它:

if (productDictionary.ContainsKey(txt_search.Text)
{
    lbl_product.Text = productDictionary[txt_search.Text];
}

不需要在多个列表上循环,并且还可以避免使用双键的潜在问题。
请注意,我还删除了不必要的int转换。如果你收到一个字符串,为什么不把它存储为一个字符串?如果它需要是一个整数,你应该验证它是一个整数,而不是盲目地转换它。如果您尝试将“123 AB”或“Foo”转换为int,会发生什么?这将如何影响您的搜索结果?;)

uwopmtnx

uwopmtnx2#

首先,在对数据执行任何操作之前,您总是需要验证用户输入。

int barcode = Convert.ToInt32(txt_barcode.Text);

如果用户在您的TextBox中输入任何非数字值,则会抛出错误
你可以这样做:

int barcode;
if(!Int.TryParse(txt_barcode.Text, out barcode))
{
   MessageBox.Show("Please enter a valid barcode!");
   return;
}

请记住,条形码值并不总是数字,因此真实的世界的场景很可能会要求字符串值。
我看不出有什么好的理由将ProductBarcode值分开。创建一个简单的类作为你的模型,像这样:

public class Product
{
    string barcode;
    public string Barcode
    {
        get => barcode;
        set => barcode = value;
    }

    string product_name;
    public string ProductName
    {
        get => product_name;
        set => product_name = value;
    }
}

然后,当你填写Collection时,你可以这样做:

// This is the collection you will be storing your products in
List<Product> Products = new List<Product>();
private void btn_add_Click(object sender, EventArgs e)
{
    string barcode = txt_barcode.Text;
    string product = txt_product.Text;

    Product myProduct = new Product()
    {
        Barcode = barcode,
        ProductName = product
    };

    Products.Add(Product); // MyCollection is of List<Product> type
}

然后,您可以通过遍历产品列表来搜索整个产品,如下所示:

private Product SearchForProduct()
{
    foreach (Product p in Products)
    {
         // This will return the first product that matches either of the cases
        // Play around with you search logic
        if (p.Barcode == "YourSearchTerm" || p.ProductName == "YourSearchTerm")
        {
            return p; // Returns the product that matches the search terms
        }
    }

    return null; // Returns null if no product matching the search term is found
}

你可以这样调用这个方法:

Product search_result = SearchForProduct(search_textbox.Text);
if(search_result == null)
{
  MessageBox.Show("No Product matching the search terms was found!");
  return;
}
else
{
  // Do something with the found product 
}

相关问题