C# 在C中从另一个类调用方法#

C# 在C中从另一个类调用方法#,c#,database,forms,methods,ado.net,C#,Database,Forms,Methods,Ado.net,我的C#应用程序有问题,我不知道如何处理。这是我学习的一个应用程序,也是我第一次使用C#和Visual Studio 因此,我有一个主窗体Form1,其中有一个MenuStrip,我可以转到另一个窗体(在DataGridView中显示的数据集中的数据表)。我可以在无连接模式(将数据写入.xml文件)和连接模式(直接同步到数据库)下工作。 在主窗体中,我有一个开关\u btn按钮,可以在其中更改工作模式。它正在使用一个类: public static class Connection_mode

我的C#应用程序有问题,我不知道如何处理。这是我学习的一个应用程序,也是我第一次使用C#和Visual Studio

因此,我有一个主窗体
Form1
,其中有一个MenuStrip,我可以转到另一个窗体(在DataGridView中显示的数据集中的数据表)。我可以在无连接模式(将数据写入.xml文件)和连接模式(直接同步到数据库)下工作。 在主窗体中,我有一个
开关\u btn
按钮,可以在其中更改工作模式。它正在使用一个类:

public static class Connection_mode
    {
        public static int connection = 0;
    }
它只是改变一个变量的值,如下所示:

Connection_mode.connection = 1;
在另一种形式(类)
函数
中,我有一种更新数据库的方法:

public void MethodToExec()
        {
            this.ds.WriteXml("D:\\sth.xml");
            this.dataSet_baza.Tables["funkcja"].Merge(funkcjaTable);
            this.funkcjaTableAdapter.Update(dataSet_baza.funkcja);
        }
当我处于无连接模式时,我有一个本地数据表,我正在对其进行更改。在这种形式下,它工作并将所有数据从本地表发送到数据库——这很好

这是我的主要问题: 当我单击main
Form1
中的
开关时,我想将数据与数据库同步。我可以关闭所有其他表单,但当我单击开关时,我想从
函数执行
MethodToExec()

我在
Switch\u btn
code:

var funkcja = new Function();
funkcja.MethodToExec();
但它并没有更新数据库


也许有更好的方法,但我不知道怎么做。

完全取消函数形式。您从未以这种方式使用表单。相反,创建一个可以从表单实例化的服务类(注意,依赖关系是任意的,因为我不熟悉您的模型):

然后在Form1 Switch_btn方法中:

var svc = new Service();

try
{
   svc.WriteXML();
}
catch(Exception ex)
{
   //do something with the exception
}
现在,您可以在所有类之间共享此功能,这些类可以实例化自己的服务对象。如果需要Service.WriteXML方法对所有类都可用,而无需实例化一个类,请将WriteXML方法设置为静态:

public static void WriteXML() {...}

并直接调用它,而不创建新的服务对象。

您不希望创建一个新的空
函数
对象并调用其MethodToExec方法(您可以使用
var funkcja=new Function();
)-您想使用现有的
函数
对象,该对象包含所有应更新的数据。您是否尝试过这样做<代码>函数
实际上是我的数据集数据表之一-我知道名称错误。我不喜欢VisualStudio为我生成这么多代码,我不知道发生了什么。所以我应该在我的数据集表中的每个类中创建服务类?唯一的问题是我无法按照您提供的方式创建TableAdapter。即使我会努力,我也非常感谢你的帮助。我很困惑。您声明:“在另一个表单(类)函数中,我有一个更新数据库的方法”。在任何情况下,都应该将业务功能和持久性逻辑移出表示层(表单),尤其是当表单必须相互调用方法时。这是一种“代码气味”。祝你好运好的,我得把我的问题弄清楚。我有一个数据集_baza连接到我的项目-它包含5个表。Function(funkcja)就是其中之一。在主窗体中,我有一个打开其他窗体的菜单提示。在表单中,我可以向表提供新数据,并将其保存为xml或更新数据库。如果关闭表单,则表单数据将存储在xml中。如果我更改了连接模式,它应该会更新数据库-在每种形式中,我都有一个类似于第一篇文章中的
MethodToExec
的方法,通过同步按钮连接。当我关闭表单并单击切换按钮时,我想运行该方法的代码。好的,您的问题更清楚了。尽管如此,封装仍然是面向对象编程的支柱之一。同时,重复的代码是一种代码气味。您应该尝试最大化封装和重用,并尽量减少代码气味。您也不应该将持久性代码与表示代码混合在一起。但是,我将更新我的答案,以包括如何传入函数表并将其持久化为XML。请随时至少投票:)
public static void WriteXML() {...}