Форма контроля из других классов и другие основные проблемы - PullRequest
0 голосов
/ 03 сентября 2010

Я не очень хорош в ООП или даже в C #, но я хочу стараться, чтобы мой код был как можно более чистым.Допустим, у нас есть что-то подобное в пространстве имен "GoogleCalendarNotificator":

   public partial class MainForm : Form
   {
        private object calendarData;

        public MainForm()
        {
            InitializeComponent();
        }

        private void recieveCalendarDataButton_Click(object sender, EventArgs e)
        {
            getCalendarDataBW.RunWorkerAsync();
        }

        private void getCalendarDataBW_DoWork(object sender, DoWorkEventArgs e)
        {
            try {
                getCalendarData getCalendarDataObj = new getCalendarData();
                calendarData = getCalendarDataObj.getData();
            } catch (Exception err) {
                statusHandler("Login Failed, Please check your Data", err.Message);
            }

            try {
                workWithCalendarData workWithCalendarDataObj = new workWithCalendarData();
                workWithCalendarDataObj.workWithData(calendarData, MainForm.ActiveForm);

                statusHandler("New calendardata recieved");
            } catch (Exception err) {
                statusHandler("Login Failed, Please check your Data", err.Message);
            }
        }

        public void statusHandler(string displayMessage, string tooltipMessage = null)
        {
            string curTime = DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString();
            statusLabel.Text = curTime + " - " + displayMessage;

            if (tooltipMessage != null)
            {
                statusLabel.ToolTipText = "Original error message: " + tooltipMessage;
            }
        }

Это хорошее решение для ErrorHandling?А как насчет этой части:

       workWithCalendarData workWithCalendarDataObj = new workWithCalendarData();
       workWithCalendarDataObj.workWithData(calendarData, MainForm.ActiveForm);

Я просто хочу дать другому классу (workWithCalendarData) возможность взаимодействия с MainForm.Но я не хочу просто писать в классе workWithCalendarData что-то вроде:

MainForm hehe = new MainForm();
hehe.DOSOMETHING();

Я хочу, чтобы это было динамически, если кто-нибудь знает, что я имею в виду.Например, предоставить классу информацию, необходимую для работы с формой (например, MainForm.ActiveForm).

Ответы [ 2 ]

0 голосов
/ 03 сентября 2010

Помните, что ваша форма также является классом.Используйте стандартные ООП-механизмы, позволяющие одному классу взаимодействовать с другим.Можно использовать события, свойства и методы.

0 голосов
/ 03 сентября 2010
MainForm hehe = new MainForm();
hehe.DOSOMETHING();

Ну, это просто не работает. Он создает новую форму, которая не видна, потому что Show () не был вызван. Вам понадобится ссылка на существующую форму, this в коде MainForm. Вы можете передать его рабочему классу, вызвав его конструктор и передав ссылку.

Это, однако, плохая идея. Это делает ваш рабочий класс зависимым от пользовательского интерфейса. Изменение графического интерфейса часто происходит, потому что оно, так хорошо видно, нарушит ваш рабочий класс. Вы решаете эту проблему, используя события. Пусть рабочий класс поднимет событие, когда что-то стоящее случится. Чтобы форма могла затем получить информацию от объекта класса и соответствующим образом обновить пользовательский интерфейс.

Также посмотрите шаблон MVC, чтобы получить некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...