WinForms 在窗体之间传递数据
WinForms passing data between Forms
我有一个名为 questions
的 table,字段名称为 qcategory
。在 WFA 中,我有一个 ToolStripMenu,其中有一个名为 Simulation
的类别和一个名为 B
的子类别。所以,我想创建一个 mysql SELECT ,其中 select 只有值与子类别值相等的行。 (table 中的 qcategory
列的值为 B
)。这是字符串:
static string dataA = "SELECT DISTINCT * FROM questions order by rand() limit 1";
唯一的问题是我有 2 个表格。一个有菜单,一个我想做的 select.
您应该尝试拆分 UI 代码和数据库代码。这称为分层(MVVM、MVC、MVP 等),但您不必这样做!
有几种方法:
1) 创建一个 class 两个表单都可以在那里引用和执行您的数据库逻辑。 (这将是目前最干净的方式)
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<string> 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 将与您的数据库交互。
要理解该解决方案,您需要更高层次的视角 - 您在表单(Class)的代码背后获得信息,并且您想 在其他地方使用该信息.
一般来说,您需要引用包含您感兴趣的信息的表格,它会在更改时告诉您信息(事件)或
信息源告诉每个感兴趣的目的地(调用方法)。然后信息源保存对消费者的引用。
这两个概念是相同的,只是交流(和参考)的方向发生了变化。
备选方案(选项 1)是您将信息目的地移动到其他地方(例如在静态 class 中)并在那里使用它。传递信息的机制几乎相同(通过参数化方法调用),但它封装了来自数据库代码的 UI-colde(表单)(SQL 查询执行)
我有一个名为 questions
的 table,字段名称为 qcategory
。在 WFA 中,我有一个 ToolStripMenu,其中有一个名为 Simulation
的类别和一个名为 B
的子类别。所以,我想创建一个 mysql SELECT ,其中 select 只有值与子类别值相等的行。 (table 中的 qcategory
列的值为 B
)。这是字符串:
static string dataA = "SELECT DISTINCT * FROM questions order by rand() limit 1";
唯一的问题是我有 2 个表格。一个有菜单,一个我想做的 select.
您应该尝试拆分 UI 代码和数据库代码。这称为分层(MVVM、MVC、MVP 等),但您不必这样做!
有几种方法:
1) 创建一个 class 两个表单都可以在那里引用和执行您的数据库逻辑。 (这将是目前最干净的方式)
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<string> 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 将与您的数据库交互。
要理解该解决方案,您需要更高层次的视角 - 您在表单(Class)的代码背后获得信息,并且您想 在其他地方使用该信息.
一般来说,您需要引用包含您感兴趣的信息的表格,它会在更改时告诉您信息(事件)或
信息源告诉每个感兴趣的目的地(调用方法)。然后信息源保存对消费者的引用。
这两个概念是相同的,只是交流(和参考)的方向发生了变化。
备选方案(选项 1)是您将信息目的地移动到其他地方(例如在静态 class 中)并在那里使用它。传递信息的机制几乎相同(通过参数化方法调用),但它封装了来自数据库代码的 UI-colde(表单)(SQL 查询执行)