0

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

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

唯一的问题是我有两种形式。一个带有菜单,一个我想在其中进行选择。

4

1 回答 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<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 是您要执行查询的表单,因为定义了将与您的数据库交互的方法/事件处理程序。

要理解解决方案,您需要更高层次的视角 - 您在表单(类)后面的代码中获取信息,并且您希望在其他地方使用该信息
通常,您需要对包含您感兴趣的信息的表单的引用,它会在更改时告诉您信息(事件)或
信息源告诉每个感兴趣的目的地(调用方法)。然后信息源保存对消费者的引用。
这两个概念是相同的,只是交流(和参考)的方向发生了变化。

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

于 2015-03-17T06:49:15.737 回答