WinForms在Forms之间传递数据

我有一个名为questions的表,其字段名称为qcategory 。 在WFA中,我有一个ToolStripMenu,其中有一个名为Simulation的类别和一个名为B的子类别。 所以,我想创建一个mysql SELECT,其中只选择值与子类别值相等的行。 (表中的列qcategory具有值B )。 这是字符串:

 static string dataA = "SELECT DISTINCT * FROM questions order by rand() limit 1"; 

唯一的问题是我有2个表格。 一个有菜单,一个我要做的选择。

您应该尝试拆分UI代码和数据库代码。 这称为分层(MVVM,MVC,MVP,…),但您不必!

有几种方法:

1)创建一个类,两个表单都可以在那里引用和执行数据库逻辑。 (这将是现在最干净的方式)

2)使用菜单在表单中创建一个事件,并在另一个表单中对其做出反应

3)您的菜单表单保存对另一个表单的引用,并在其上执行一个方法,通过所选的子项目。

在代码中

1

 public static class SqlClass { public static void ExecuteQuery(string menuItem) { //execute query } } Form 1 //menu changed... SqlClass.ExecuteQuery(menuItem) 

2

 Form1: public event EventHandler MenuItemChanged; //menu changed... if(this.MenuItemChanged != null) this.MenuItemChanged(this, menuitem) Form2: public Form2(Form1 otherForm) { InitializeComponent(); _otherForm.MenuItemChange += //... handle your sql code } 

3

 private readonly Form2 _otherForm; public Form1(Form2 otherForm) { InitializeComponent(); _otherForm = otherForm; } //menu changed... otherForm.ExecuteQuery(menuitem); 

对于示例,表单2是您要执行查询的表单,因为已定义了将与您的数据库交互的Method / Event-Handler。

要理解解决方案,您需要一个更高级别的视角 – 您在Form(一个类)后面的代码中获取信息,并且您希望在其他地方使用该信息
一般而言,您需要提供包含您感兴趣的信息的表格,并在更改时告诉您信息(事件)或
信息源告诉每个感兴趣的目的地(调用方法)。 然后信息源保存对消费者的引用。
这两个概念只是通信(和参考)变化的方向相同。

替代方案(选项1)是您将信息目的地移动到其他地方(例如在静态类中)并在那里使用它。 传递信息的机制几乎相同(通过参数化方法调用),但它封装了数据库代码中的UI-colde(Form)(SQL查询执行)