Проверьте, нажата ли кнопка с поцарапанной кнопки - PullRequest
0 голосов
/ 24 марта 2019

У меня есть консольное приложение, которое вызывает форму, подобную этой, я поместил ее в другой класс, чтобы сделать мой код организованным.

Я сделал код формы с нуля так:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Ultra_Script.MessageBoxes
{
    public class MsgBoxes
    {
        #region MsgBox k výběru základního SW (stažení z netu nebo Synology)
        public static void SynoInternet()
        {
            Application.EnableVisualStyles();
            Form SynoInternet = new Form();  

            Button Synology = new Button()
            {
                Left = 80,
                Width = 90,
                Height = 30,
                Top = 75,
                Text = "Synology"
            };

            Button Internet = new Button()
            {
                Left = 190,
                Width = 90,
                Height = 30,
                Top = 75,
                Text = "Internet"
            };

            Label SynoInternetLabel = new Label()
            {
                Left = 60,
                Width = 350,
                Height = 25,
                Top = 30,
                Text = "Chceš SW stáhnout z internetu nebo HD Synology?"
            };

            Label fasterLabel = new Label()
            {
                Left = 80,
                Width = 60,
                Height = 20,
                Top = 110,
                Text = "(Rychlejší)"
            };

            SynoInternet.Width = 380;
            SynoInternet.Height = 170;
            SynoInternet.Controls.Add(fasterLabel);
            SynoInternet.Controls.Add(SynoInternetLabel);
            SynoInternet.Controls.Add(Synology);
            SynoInternet.Controls.Add(Internet);
            SynoInternet.ShowDialog();

        }
        #endregion

    }
}

Но понятия не имею, как проверить (в этом классе), была ли нажата кнопка.

Я знаю, что мне как-то нужно создать EventHandler, но не удалось.

Я попробовал что-то вроде этого:

  Synology.Click += (sender, args) =>
            {
                MessageBox.Show("You clicked Synology");
            };

Я не получаю никакой ошибки с этим, но когда я нажимаю Synology, ничего не происходит.

Есть идеи?

Спасибо за все ответы,

John

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Итак, у меня есть еще одна проблема.

У меня сейчас такой класс:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Ultra_Script.MessageBoxes
{
    public class MsgBoxes
    {
        #region MsgBox k výběru základního SW (stažení z netu nebo Synology)
        public static void SynoInternet()
        {
            Application.EnableVisualStyles();
            Form SynoInternet = new Form();  

            Button Synology = new Button()
            {
                Left = 80,
                Width = 90,
                Height = 30,
                Top = 75,
                Text = "Synology"
            };

            Button Internet = new Button()
            {
                Left = 190,
                Width = 90,
                Height = 30,
                Top = 75,
                Text = "Internet"
            };

            Label SynoInternetLabel = new Label()
            {
                Left = 60,
                Width = 350,
                Height = 25,
                Top = 30,
                Text = "Chceš SW stáhnout z internetu nebo HD Synology?"
            };

            Label fasterLabel = new Label()
            {
                Left = 80,
                Width = 60,
                Height = 20,
                Top = 110,
                Text = "(Rychlejší)"
            };

            SynoInternet.Width = 380;
            SynoInternet.Height = 170;
            SynoInternet.Controls.Add(fasterLabel);
            SynoInternet.Controls.Add(SynoInternetLabel);
            SynoInternet.Controls.Add(Synology);
            SynoInternet.Controls.Add(Internet);

            Synology.Click += (sender, args) =>
            {
                SynoInternet.Dispose();
                Installation_Functions.InstallBasicSW();
            };

            Internet.Click += (sender, args) =>
            {
                MessageBox.Show("You clicked Internet");
            };

            SynoInternet.ShowDialog();

        }
        #endregion

    }
}

Класс InstallFunctions просто вызывает этот загрузчик файлов:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Threading;

namespace Ultra_Script
{
    class FileDownloader
    {

        private readonly string _url;
        private readonly string _fullPathWheretoSave;
        private bool _result = false;
        private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0);

        public FileDownloader(string url, string fullPathWheretoSave)
        {

            if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url");
            if (string.IsNullOrEmpty(fullPathWheretoSave)) throw new ArgumentNullException("fullPathWhereToSave");

            this._url = url;
            this._fullPathWheretoSave = fullPathWheretoSave;

        }

        public bool StartDownload(int timeout)
        {

            try
            {
                System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWheretoSave));

                if (File.Exists(_fullPathWheretoSave))
                {
                    File.Delete(_fullPathWheretoSave);
                }
                using (WebClient client = new WebClient())
                {
                    var ur = new Uri(_url);
                    //client.Credentials = new NetworkCredential("username", "password");
                    client.DownloadProgressChanged += WebClientDownloadProgressChanged;
                    client.DownloadFileCompleted += WebClientDownloadCompleted;
                    Console.WriteLine(@"Stahuji potrebne soubory:");
                    client.DownloadFileAsync(ur, _fullPathWheretoSave);
                    _semaphore.Wait(timeout);
                    return _result && File.Exists(_fullPathWheretoSave);
                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Cant download file");
                Console.Write(e);
                return false;
            }
            finally
            {
                this._semaphore.Dispose();
            }

        }

        private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            Console.Write($"/r --> {e.ProgressPercentage}%");  
        }

        private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args)
        {
            _result = !args.Cancelled;
            if (!_result)
            {
                Console.Write(args.Error.ToString());
            }
            Console.WriteLine(Environment.NewLine + "Download Finished!");
            _semaphore.Release();
        }

        public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec)
        {
            return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec);
        }

    }

}


Что делаетего закрытие формы, а затем запустить функцию возврата в консоли.Но он только говорит: «Начать загрузку» и после тайм-аута: Исключение: System.ComponentModel.Win32Exception в System.dll в Visual Studio

Когда я запускаю пошаговую отладку, я думаю, что она остановилась наэтот метод семафоров, но он не работает, даже если я удаляю этот метод в загрузчике файлов.

Когда я вызываю функцию из консоли, ее нормальная работа возникает только тогда, когда я вызываю ее через эту кнопку в окне сообщения.

0 голосов
/ 24 марта 2019

вам нужно только сделать это событие

       Synology.Click += (sender, args) =>
        {
            MessageBox.Show("You clicked Synology");
        }; 

перед методом showDialog ();

строки после события showDialog не работают, пока метод showDialog не вернет значение

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

Я надеюсь, что это работает для вас.

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