2012-04-28 65 views
4

我正在爲超市創建結帳系統。它由一個結帳,服務器和MIS程序組成,在它們之間運行WCF服務。我遇到的問題是checkout程序是一個windows窗體,它在application_load方法中做了一些必要的事情,然後就退出了。Windows窗體加載然後退出

下面的代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using CheckoutLibrary; 
using Checkout.ServerLibraryService; 
using Checkout.MarketService; 

namespace Checkout 
{ 
    public partial class theForm : Form 
    { 
     private static int checkoutID = 3; 
     private Product[] allProducts; 

     public theForm() 
     { 
      InitializeComponent(); 
     } 

     private void theForm_Load(object sender, EventArgs e) 
     { 
      // First cache all products 
      SupermarketServiceSoapClient marketService = new SupermarketServiceSoapClient(); 
      allProducts = marketService.GetAllProducts(); 
      // Load the service provided by the server 
      ServiceClient serverService = new ServiceClient(); 
      // Load the event handlers for the bar code scanner 
      BarcodeScanner scanner = new BarcodeScanner(); 
      scanner.ItemScanned += new BarcodeScanner.ItemScannedHandler(scanner_ItemScanned); 
      scanner.AllItemsScanned += new BarcodeScanner.AllItemsScannedHandler(scanner_AllItemsScanned); 
      scanner.Start(checkoutID); 
     } 

     void scanner_AllItemsScanned(EventArgs args) 
     { 
      throw new NotImplementedException(); 
     } 

     void scanner_ItemScanned(ScanEventArgs args) 
     { 
      itemTextBox.Text = "Scanned " + GetItemName(args.Barcode); 
     } 

     private void scanItemButton_Click(object sender, EventArgs e) 
     { 
      scanner_ItemScanned(new ScanEventArgs(GetRandBarcode())); 
     } 

     // A barcode -> product name look up method 
     public string GetItemName(int barcode) 
     { 
      return allProducts[barcode].Description + " @ " + allProducts[barcode].Price; 
     } 

     // Method to grab a random barcode for simulation 
     private int GetRandBarcode() 
     { 
      Random rand = new Random(); 
      return rand.Next(0,500); 
     } 
    } 
} 

而且Program.cs的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace Checkout 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new theForm()); 
     } 
    } 
} 

感謝任何見解。

+0

可以顯示打開窗體(show/showdialog)的代碼嗎? – Steve 2012-04-28 12:09:48

+0

如在中,program.cs的內容? – Lee 2012-04-28 12:20:31

+0

在@bugfixr中查看您的意見回答是沒有必要的。很明顯,你的表單顯示。所以現在嘗試在_scanner_AllItemsScanned_事件中放置一個斷點。只是爲了確保當你的掃描儀開始不執行你的一些事件。 – Steve 2012-04-28 12:25:25

回答

4

在WinForms中,如果您的form_load引發異常,它將退出而不顯示任何內容。討厭,但我猜這就是問題所在。

您可以嘗試try/catch,或者您可以點擊CTRL+ALT+E並檢查Thrown ColumnCommon Language Runtime Exceptions以查看錯誤。

更新:根據意見

,這裏是一個樣本的方式在另一個線程中執行的東西。

ThreadStart ts = new ThreadStart(() => { 
    try { 
     scanner.Start(checkoutID); 
    } catch { 
     // Log error 
    } 
}); 
Thread t = new Thread(ts); 
t.Start(); 
+0

啊,我確實這麼想過,但我期待着一個未處理的異常。我會檢查這個,謝謝。我懷疑它在嘗試初始化其中一項服務時可能會拋出異常。 – Lee 2012-04-28 12:02:04

+0

Try-Catch沒有發現任何異常。事實上catch塊中的斷點也沒有被觸發。嗯.. – Lee 2012-04-28 12:05:31

+0

第一行代碼上的斷點實際上是否被打中?任何運氣檢查CTRL + ALT + E中的「Thrown」列(也可在Debug/Exceptions菜單中找到)? – bugfixr 2012-04-28 12:07:28