Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForms在窗体之间传递数据_C#_Winforms_Toolstripmenu - Fatal编程技术网

C# WinForms在窗体之间传递数据

C# WinForms在窗体之间传递数据,c#,winforms,toolstripmenu,C#,Winforms,Toolstripmenu,我有一个名为questions的表,其中有一个字段名qcategory。在WFA中,我有一个ToolStripMenu,其中有一个名为Simulation的类别和一个名为B的子类别。所以,我想创建一个mysql SELECT,其中只选择值与子类别值相等的行。(表中的列qcategory具有值B)。这是字符串: static string dataA = "SELECT DISTINCT * FROM questions order by rand() limit 1"; 唯一的问题是我有两张表

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

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

唯一的问题是我有两张表格。一个是菜单,另一个是我想选择的地方。

您应该尝试拆分UI代码和数据库代码。这被称为分层(MVVM、MVC、MVP等等),但您不必这样做

有几种方法:

1) 创建一个类,使两个表单都可以引用并执行数据库逻辑。(这将是目前最干净的方式)

2) 使用菜单在表单中创建事件,并在另一个表单中对其作出反应

3) 菜单窗体保存对另一个窗体的引用,并在其上执行传递选定子项的方法

编码

一,

二,

对于示例,表单2是要执行查询的表单,因为定义了将与数据库交互的方法/事件处理程序

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


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

要将字符串从带有菜单的表单传递到另一个表单吗?完全正确!你能告诉我吗?嗯……我真的不明白你的建议……你能用我的cod给我举个例子吗?表单where is菜单名为
Student
,表单where is query名为
Sim
。在你的解释中,我不明白在我的问题中谁是Form1和Form2。当然,他不能用你的代码给出一个例子。您自己没有显示任何代码。我设法修复了它。谢谢:)Philip,没有这方面的代码,因为对于菜单,我和用户Dev Express只需要写3-4行。但这很好:)
public static class SqlClass
{
    public static void ExecuteQuery(string menuItem)
    {
        //execute query
    }
}


Form 1
//menu changed...
SqlClass.ExecuteQuery(menuItem)
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
}
private readonly Form2 _otherForm;

public Form1(Form2 otherForm)
{
    InitializeComponent();
    _otherForm = otherForm;
}

//menu changed...
otherForm.ExecuteQuery(menuitem);