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