【问题标题】:Call method from another class in C#从 C# 中的另一个类调用方法
【发布时间】:2014-05-19 22:04:59
【问题描述】:

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

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

public static class Connection_mode
    {
        public static int connection = 0;
    }

它只是像这样改变一个变量的值:

Connection_mode.connection = 1;

在另一种形式(类)Function 我有一个更新数据库的方法:

public void MethodToExec()
        {
            this.ds.WriteXml("D:\\sth.xml");
            this.dataSet_baza.Tables["funkcja"].Merge(funkcjaTable);
            this.funkcjaTableAdapter.Update(dataSet_baza.funkcja);
        }

当我处于无连接模式时,我有一个本地 DataTable,我正在对其进行更改。在这种形式下,它正在工作并将所有数据从本地表发送到数据库 - 这很好。

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

我已经在Switch_btn 代码中尝试过类似的东西:

var funkcja = new Function();
funkcja.MethodToExec();

但它没有更新数据库。

也许有更好的方法可以做到这一点,但我不知道如何。

【问题讨论】:

  • 你不想创建一个 新的和空的 Function 对象并调用它的 MethodToExec 方法(你用 var funkcja = new Function(); 做的) - 您想使用现有的Function 对象,其中包含所有应更新的数据。
  • 你试过这样做吗? stackoverflow.com/questions/1665533/…

标签: c# database forms methods ado.net


【解决方案1】:

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

public class Service()
{
  private DataSet ds;
  private DataSet dataSet_baza;
  private TableAdapter funkjaTableAdapter;

  public Service()
  {
    ds = new DataSet();
    dataSet_baza = new DataSet();
    funkjaTableAdapter = new TableAdapter();
  }

  public void WriteXML(DataTable funkcjaTable)
  {
    this.ds.WriteXml("D:\\sth.xml");
    this.dataSet_baza.Tables["funkcja"].Merge(funkcjaTable);
    this.funkcjaTableAdapter.Update(dataSet_baza.funkcja);
  }
}

然后在您的 Form1 Switch_btn 方法中:

var svc = new Service();

try
{
   svc.WriteXML();
}
catch(Exception ex)
{
   //do something with the exception
}

现在,您可以在所有类之间共享此功能,这些类可以实例化自己的 Service 对象。如果您需要 Service.WriteXML 方法可用于所有类而不需要实例化一个,请将 WriteXML 方法设为静态:

public static void WriteXML() {...}

并且直接调用它而不创建新的Service对象。

【讨论】:

  • Function 实际上是我的数据集 DataTables 之一 - 错误的名称,我知道。我不喜欢 Visual Studio 为我生成这么多代码而且我不知道发生了什么。所以我应该在我的数据集表的每个类中创建服务类?唯一的问题是我无法以您提供的方式创建 TableAdapter。即使我会努力,我也非常感谢你的帮助。
  • 我很困惑。您声明:“在另一种形式(类)函数中,我有一个更新数据库的方法”。在任何情况下,您都应该将业务功能和持久性逻辑从表示层(表单)中移出,尤其是当您的表单必须相互调用方法时。那是“代码气味”。祝你好运!
  • 好的,我必须明确我的问题。我有一个连接到我的项目的 dataSet_baza - 它包含 5 个表。函数(funkcja)就是其中之一。在主窗体中,我有一个 MenuStrip 来打开其他窗体。在表单中,我可以向我的表提供新数据并将其保存到 xml 或更新数据库。如果我关闭表单数据存储在 xml 中。如果我更改连接模式,它应该更新数据库 - 在每种形式中,我都有一个方法看起来像第 1 篇文章中的MethodToExec,并通过同步按钮连接。当我关闭表单并单击“切换”按钮时,我想运行该方法的代码。
  • 好的,你的问题更清楚了。尽管如此,封装仍然是面向对象编程的支柱之一。同时,重复代码是一种代码异味。您应该尝试最大化封装和重用,并尽量减少代码异味。您还应该永远不要将持久性代码与演示代码混合。
  • 但是,我将更新我的答案,包括如何传入函数表并将其保存到 XML。请随时至少投票:)
猜你喜欢
  • 2020-10-20
  • 2014-01-31
  • 2015-06-09
  • 1970-01-01
  • 2013-05-17
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
相关资源
最近更新 更多