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查询执行)