По неизвестной причине нажатие кнопки закрывает мое окно. Как я могу это исправить? - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь повторить простое добавление 2 записей с помощью кнопки в Monodevelop (показано, как сделать это шаг за шагом), но каким-то образом окно закрывается через 2 секунды после нажатия кнопки, фактически ничего не меняя.

Код для кнопки:

using Gtk;
using Frontend.ChatService;

public partial class MainWindow : Gtk.Window
{
    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        Build();
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        Application.Quit();
        a.RetVal = true;
    }

    protected void OnButton1Clicked(object sender, EventArgs e)
    {
        ChatService client = new ChatService();
        int x = Int32.Parse(entry1.Text);
        int y = Int32.Parse(entry2.Text);
        int sum = client.Add(x, y);
        entry1.Text = sum.ToString();
    }
}

И сумма (которую я проверял и думаю работает):

using System;
using System.Web;
using System.Web.Services;

namespace Backend
{
    public class ChatService : System.Web.Services.WebService
    {
        [WebMethod]
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

Я оставил основной файл program.cs как сгенерированный и это:

using System;
using Gtk;

namespace Frontend
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Application.Init();
            MainWindow win = new MainWindow();
            win.Show();
            Application.Run();
        }
    }
}

Окно всплывает как надо и не показывает проблем, пока не нажата кнопка.

Edit: Я забыл запустить серверную / серверную часть, поэтому функция не была найдена ... (я полагаю, ошибка начинающих) Работает сейчас

1 Ответ

0 голосов
/ 22 мая 2019

Возможно, проблема в том, что ваш код выдает исключение, о котором вы не знаете.Проблема в коде, который обрабатывает нажатую кнопку.

protected void OnButton1Clicked(object sender, EventArgs e)
{
    ChatService client = new ChatService();
    int x = Int32.Parse(entry1.Text);
    int y = Int32.Parse(entry2.Text);
    int sum = client.Add(x, y);
    entry1.Text = sum.ToString();
}

Давайте построчно:

ChatService client = new ChatService();

Здесь вы создаете новый экземпляр того, что кажетсясистемный сервис или, возможно, веб-сервисы.Это может произойти, если служба неизвестна (в первом случае), или если соединение прервано или не достигает места назначения и т. Д., Во втором случае.

Эти строки также деликатны:

int x = Int32.Parse(entry1.Text);
int y = Int32.Parse(entry2.Text);

Они будут выбрасывать, если поле entry1 или entry2 пустое или содержит букву ...

Для управления этими случаями необходимо добавить try... catch блоки в соответствующих местах.В качестве альтернативы вы можете использовать Int32.TryParse.

Например, если предположить, что служба находится в Интернете:

protected void OnButton1Clicked(object sender, EventArgs e)
{
    ChatService client;
    int x;
    int y;

    try {
        client = new ChatService();
    } catch(HttpRequestException exc) {
        client = null;

        var dlg = new Gtk.MessageDialog(
                            this,
                            Gtk.DialogFlags.Modal,
                            Gtk.MessageType.Error,
                            Gtk.ButtonsType.Ok,
                            "Connection error"
         );

        dlg.Text = exc.Message;
        dlg.Run();
        dlg.Destroy();
    }

    if ( client != null ) {
        if ( !int.TryParse( entry1.Text, out x) {
            entry1.Text = "0";
            x = 0;
        }

        if ( !int.TryParse( entry2.Text, out y) {
            entry2.Text = "0";
            y = 0;
        }

        int sum = client.Add(x, y);
        entry1.Text = sum.ToString();
    }
}

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

...