我试图在Monodevelop中使用按钮复制一个简单的2个条目的添加(显示了如何逐步进行操作),但是以某种方式在按下按钮后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();
}
}
}
该窗口确实会弹出,直到按下该按钮才显示问题。
编辑: 我忘了运行后端/服务器部分,这就是为什么找不到该功能的原因……(我想是初学者的错误) 现在可以使用
答案 0 :(得分:0)
问题可能是您的代码引发了您不知道的异常。问题出在处理被单击按钮的代码中。
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();
在这里,您正在创建似乎是系统服务或Web服务的新实例。如果不知道该服务(在前一种情况下),或者在后一种情况下,如果连接中断或未到达目的地等,则可能抛出该错误。
这些行也很微妙:
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();
}
}
当然,获取正确处理错误的代码总是很难。 希望这会有所帮助。