【问题标题】:WinForms passing data between Forms [duplicate]WinForms在表单之间传递数据[重复]
【发布时间】:2015-03-17 06:32:50
【问题描述】:

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

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

唯一的问题是我有 2 个表格。一个带有菜单,一个我想在其中进行选择。

【问题讨论】:

  • 您想将带有菜单的表单中的字符串传递给另一个表单吗?
  • 没错!你能帮帮我吗?

标签: c# winforms toolstripmenu


【解决方案1】:

您应该尝试拆分 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 查询执行)

【讨论】:

  • 嗯..我不太明白你的建议..你能给我一个使用我的鳕鱼的例子吗?菜单在哪里的表单命名为Student,查询在哪里的表单命名为Sim。在您的解释中,我不明白我的问题中的 Form1 和 Form2 是谁。
  • 他当然不能用你的代码举例。您自己没有显示任何代码。
  • 我设法修复了它。谢谢 :) Philip,没有代码,因为菜单我使用 Dev Express,我只需要写 3-4 行。不过没关系:)
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多