2008-11-11 38 views
10

Tôi có một đối tượng bắt đầu một chuỗi, mở một tệp và đợi đầu vào từ các lớp khác. Vì nó nhận được đầu vào, nó ghi nó vào đĩa. Về cơ bản, đó là một lớp đăng nhập dữ liệu an toàn chủ đề ....NET Windows Forms quy tắc thời gian thiết kế

Đây là phần kỳ lạ. Khi tôi mở một biểu mẫu trong trình thiết kế (Visual   Studio   2008) sử dụng đối tượng mà tệp được tạo. Nó rõ ràng đang chạy trong quá trình thiết kế thời gian vhost ...

Điều kỳ lạ là tôi đã không thể tái tạo vấn đề trong một dự án khác. Tôi không chắc chắn những gì các quy tắc được cho mã được thực hiện trong các nhà thiết kế và mã mà không. Ví dụ, việc tạo một tệp trong một hàm tạo Windows Forms không thực sự tạo tệp lúc thiết kế ...

Giải thích là gì? Có một tham chiếu?

Trả lời

11

Bạn có thể kiểm tra UsageMode của LicenseManager, để kiểm tra xem mã có đang trong thời gian thiết kế hay không.

System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime

Dưới đây là một ví dụ nhanh:

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

namespace Test 
{ 
    public class ComponentClass : Component 
    { 
     public ComponentClass() 
     { 
      MessageBox.Show("Runtime!"); 
     } 
    } 
} 

Khi thành phần này được thêm vào hình thức của bạn trong thiết kế, bạn sẽ ngay lập tức nhận được một hộp tin nhắn.

Để tránh điều này bạn có thể thêm một đơn giản câu lệnh if để kiểm tra xem mã không có trong thời gian thiết kế

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

namespace Test 
{ 
    public class ComponentClass : Component 
    { 
     public ComponentClass() 
     { 
      if (LicenseManager.UsageMode != LicenseUsageMode.Designtime) 
      { 
       MessageBox.Show("Runtime!"); 
      } 
     } 
    } 
} 

Sau khi thêm câu lệnh if, các bảng thông báo không còn xuất hiện khi các thành phần được thêm vào biểu mẫu thông qua nhà thiết kế.

Tôi hy vọng điều này sẽ hữu ích.

-jeremy

0

Có một số điều bạn không nên làm với nhà thiết kế. Tôi không có bất kỳ bằng chứng cứng, nhưng tôi thấy rằng các nhà thiết kế Windows Forms ghét nó khi bạn lấy đi constructor mặc định từ nó. Chỉ cần tiếp tục và tạo các tình trạng quá tải mới, nhưng hãy để nguyên hàm khởi tạo trống.

Cũng cố gắng tránh thực hiện các sự kiện trong các lớp cơ sở bạn được kế thừa từ đó.

2

Bạn cũng có thể sử dụng để kiểm tra xem thiết kế Visual Studio đang chạy mã:

public static bool DesignMode 
{ 
    get { return (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv"); } 
} 

Sau đó, trong Form_Load:

if (!DesignMode) 
{ 
    // Run code that breaks in Visual Studio Designer (like trying to get a DB connection) 
} 

Tuy nhiên, đây là ít thanh lịch hơn bằng cách sử dụng LicensManager.UsageMode, nhưng nó hoạt động (cho đến khi Microsoft thay đổi tên của quá trình Visual Studio chạy dưới).

+0

Người đàn ông, phương pháp "kém thanh lịch" của bạn là phương pháp duy nhất hoạt động. LicensManager.UsageMode không hoạt động, ví dụ: khi nhà thiết kế đang gọi phương thức 'property get' của điều khiển người dùng. – Soonts

11

Hàm khởi tạo của điều khiển hoặc biểu mẫu không được thực thi khi chỉnh sửa lớp đó trong trình thiết kế (cũng không được gọi là OnLoad). Tôi thỉnh thoảng sử dụng điều này để đặt một giá trị trong thiết kế (ví dụ: làm cho con của nó kiểm soát tất cả Hiển thị trong trình thiết kế) nhưng ghi đè một số giá trị mặc định khác trong hàm tạo (ví dụ: ẩn các điều khiển con nhất định sẽ chỉ hiển thị trong một số trường hợp nhất định, chẳng hạn như chỉ báo trên thanh trạng thái).

Tuy nhiên, hàm tạo thực hiện được thực thi nếu điều khiển được đặt dưới dạng con trên một điều khiển hoặc biểu mẫu khác trong trình thiết kế. OnLoad cũng được thực hiện. Đây có thể là cách mã đăng nhập của bạn được kích hoạt ngẫu nhiên trong nhà thiết kế.

Để phát hiện thiết kế so với thời gian chạy, an answer đến another question có ảnh chụp màn hình của một số kiểm tra emperical hiển thị các giá trị được trả về bởi một số phương pháp phổ biến. Có vẻ như việc kiểm soát con của điều khiển con (hai cấp độ xuống) của biểu mẫu hoặc điều khiển được chỉnh sửa trong trình thiết kế sẽ thấy DesignMode == false của riêng nó, vì vậy kiểm tra thuộc tính bình thường sẽ không bảo vệ mã (ví dụ: trong phương thức OnLoad) cho các điều khiển lồng nhau trong một điều khiển được thêm vào trong trình thiết kế. Nếu bạn đang kiểm tra DesignMode như người ta mong đợi, nó có thể là tổ làm cho nó đi xung quanh kiểm tra đó. Nó cũng luôn thấy DesignMode == false bên trong hàm tạo.

Ngoài ra, lưu ý rằng LicenseManager.UsageMode kiểm tra chỉ xem DesignTime trong hàm tạo; khi OnLoad được gọi là nó nằm trong giấy phép RunTime LicenseContext. Giải pháp hoàn chỉnh nhất có thể là kiểm tra LicenseManager.UsageMode trong hàm khởi tạo của điều khiển hoặc biểu mẫu (hoặc thành phần) và lưu cài đặt thành biến thành viên hoặc thuộc tính mà bạn có thể kiểm tra sau để tránh chạy mã không bao giờ chạy trong trình thiết kế ngay cả khi lồng nhau. Ngoài ra còn có một cách tiếp cận khác trong another answer cho câu hỏi khác mà tài khoản cho làm tổ nhưng chỉ hoạt động bên ngoài các nhà xây dựng.

+0

Tôi nghĩ điều này có thể giúp tôi. Cảm ơn! ++ – John

+0

Hiệu chỉnh: nó đã giúp tôi. :) – John

+0

Tuyệt! Vui mừng khi nghe nó. –

2

Vâng, vì điều này đã được hồi sinh dù sao, đây là chức năng tôi sử dụng để xác định xem tôi đang ở chế độ thiết kế:

public static bool IsAnyInDesignMode(Control control){ 
    while(control != null){ 
     if(control.Site != null && control.Site.DesignMode) 
      return true; 
     control = control.Parent; 
    } 
    return false; 
} 

này xử lý các trường hợp điều khiển là một đứa trẻ được tạo ra bằng cách điều khiển khác. Thuộc tính DesignMode chỉ được đặt cho các điều khiển do chính nhà thiết kế tạo ra.

Các vấn đề liên quan