Вызов метода из другого класса в C #

1

У меня проблема с моим С# -приложением, и я не знаю, как с этим бороться. Это приложение для моих исследований, и в первый раз я использую С# и Visual Studio.

Итак - у меня есть основная форма Form1 с MenuStrip, где я могу перейти к другим формам (которые являются данными из моего набора данных, отображаемого в 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, на котором я вношу изменения. И в этой форме он работает и отправляет все данные из локальной таблицы в базу данных - это приятно.

И это мой главный вопрос: я хочу синхронизировать данные с базой данных, когда я нажимаю Switch_btn в основном Form1. Я могу закрыть все остальные формы, но когда я нажимаю "Переключатель", я хочу выполнить метод MethodToExec() из формы Function.

Я пробовал это так в коде Switch_btn:

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

Но это не обновление базы данных.

Может быть, есть лучший способ сделать это, но я не знаю, как это сделать.

Теги:
database
methods
ado.net
forms

1 ответ

0
Лучший ответ

Уберите форму Function вообще. Таким образом, вы никогда не используете формы. Вместо этого создайте класс обслуживания, который вы можете создать из своей формы (обратите внимание, что зависимости произвольны, поскольку я не знаком с вашей моделью):

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.WriteXML для всех классов без необходимости его создания, сделайте метод WriteXML статическим:

public static void WriteXML() {...}

И вызовите его напрямую, не создавая новый объект службы.

  • 0
    Function на самом деле является одним из моих наборов данных DataTables - я знаю неправильное имя. Мне не нравится, когда Visual Studio генерирует для меня столько кода, и я не знаю, что происходит. Таким образом, я должен создать класс Service в каждом классе, который является моей таблицей dataSet? Единственная проблема заключается в том, что я не могу создать TableAdapter так, как вы указали. Даже если бы я работал над этим, и я очень благодарен за вашу помощь.
  • 0
    Я не совсем понимаю. Вы утверждаете: «В другой форме (классе) функции у меня есть метод, который обновляет базу данных». В любом случае вы должны удалить бизнес-функциональность и логику персистентности из уровня представления (форм), особенно если ваши формы должны вызывать методы друг друга. Это «кодовый запах». Удачи!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню