尝试通过另一种形式在组合框中添加项目的 C# 问题

C# problem trying to add items in combobox via another form

我有这种情况:在我的表单中 Order 有一个组合框,里面有很多产品。预计用户可以将产品添加到组合框以在 Order 中使用,但这是通过另一种名为 ProductAdd 的形式完成的,基本上是用一个文本框制作的,用户可以在其中输入产品名称和它添加了一个按钮。由于在 ProductAdd 表单中无法访问 Order 表单中的组合框,因此我在 Order 中创建了一个方法,该方法将产品传递到组合框中。

该字符串未添加到其他形式的组合框中。

这是Order在其combobox中操作的方法

public void addProductInCbb(string newProduct)
  {
      cbbProdotti.Items.Add(newProduct);
  }

这是另一种形式的方法ProductAdd将字符串添加到我的cbb

private void btnConfirmNewProduct_Click(object sender, EventArgs e)
        {   
            Order o = new Order(new Form1()); //that's because I think I need an instance of Order to call the method... is that correct?
            String newProduct= txtNewProduct.Text; //get product string from txt

            //boring checks to say if product already exists
            bool found = false;
            ArrayList products= o.getProducts();

            foreach(String product in products)
            {
                if (product.Equals(newProduct)) found = true;
            }
            if (!found)
            {
                o.addProductInCbb(newProduct); //method call from Order
                MessageBox.Show("Success!","", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }  
            else MessageBox.Show("Product already exists!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                
        }

-编辑- 我制作了奇怪的“Order o = new Order(new Form1())”构造函数,因为:调用 addProductInCbb(string) 我需要一个 Order 实例,但是反过来,Order 构造函数需要一个 Form1 参数,因为当 Order 完成时,使用 form1 和 Order form 中的所有数据创建了一个 PDF...这会导致我的问题吗?

在不影响现有代码的情况下,可以遵循以下一组学习步骤:

  • 创建一个新的 winforms 项目
  • 确保它有 2 个表单(form1、form2)
  • 在第一个表单上放置一个组合框 (comboBox1) 和一个按钮 (button1)
  • 在第二种形式上,放置两个文本框(textBox1、textbox2)和一个按钮(button1)
  • 在form1的构造函数中,在IinitializeComponent之后,放入:

    var dt = new DataTable();
    dt.Columns.Add("disp");
    dt.Columns.Add("val");
    dt.Rows.Add("first", "1");
    dt.Rows.Add("second", "2");

    comboBox1.DisplayMember = "disp";
    comboBox1.ValueMember = "disp";
    comboBox1.DataSource = dt;

    new Form2(dt).Show();

  • 双击表单 1 上的按钮并将代码放入事件处理程序中。这只是为了演示一些其他的东西,不需要在表单之间传递数据:
    MessageBox.Show(comboBox1.SelectedValue.ToString());
  • 修改Form2的构造函数接受一个DataTable参数;将参数存储到 class 级别变量
    private DataTable _dt;

    public Form2(DataTable dt){
      _dt = dt;
    }

  • 双击form2的按钮,输入处理代码:
    _dt.Rows.Add(textBox1.Text, textBox2.Text);
  • 运行 应用程序。您会注意到,无论您在 form2 上的 tb1 和 tb2 中写入什么,都会在您单击按钮时添加到组合中。单击 form1 上的按钮显示例如在组合中选择“第一个”时为“1”。这就是您向用户显示一些不错的字符串值的方式,但您还有一些其他值,例如 int ID,在它后面

发生的事情是:form2 将数据添加到 form2 和 form1 的组合都知道的共享数据表中(组合使用数据表作为其数据源)。添加行时,绑定机制确保通知数据绑定控件并且它会自行刷新。

它不一定是数据表,它可以是您共享的任何包含 class 的数据,但是数据表对于 windows 表单应用程序中的数据绑定相当方便