2009-12-16 33 views
6

Tôi triển khai biểu mẫu lớn trong winforms C# với Visual Studio 2008. sau khi làm việc tốt cho phần lớn hộp thoại bắt đầu hiển thị rất nhiều lỗi lầm như trong tiêu đề khi tôi cố mở nhà thiết kế.bị lỗi Biến <tên biến> hoặc không khai báo hoặc chưa bao giờ được gán

"Biến là một trong hai không khai báo hoặc không bao giờ được giao"

tôi nhận này cho rất nhiều các điều khiển mà làm việc tốt trước đó. Tôi nghĩ rằng nó sẽ xảy ra với điều khiển tùy chỉnh mà tôi sử dụng

+1

Hiển thị mã cho chúng tôi và chỉ dòng thông báo lỗi xuất hiện. –

+0

Sao chép tất cả các lỗi văn bản từ desiner và dán nó ở đây;) – serhio

Trả lời

0

Kiểm tra tập tin designer.cs của bạn. Nó có thể thiếu các khai báo kiểm soát.

Mã của bạn có đang chạy và chạy không?

+0

yeah ... chỉ tác giả không chỉ định ngôn ngữ được sử dụng :) – serhio

+0

Ông nói C# - "tôi thực hiện một hình thức lớn trong winforms C#" – Rezler

+0

cảm ơn trả lời . có mã biên dịch và chạy. làm cách nào để tôi kiểm tra designer.cs? tuyên bố kiểm soát nào nên được thực hiện? Tal – tal

6

khuyến nghị đầu tiên là không sử dụng bất kỳ logic phức tạp theo hình thức constructor, nhưng vào những hình thức tải sự kiện (hoặc ghi đè của phương pháp onload).

Các nhà thiết kế sử dụng mã của constructor để hiển thị các hình thức, và nếu bạn có lỗi hình thức của bạn sẽ được "undisplayable" trong thiết kế VS.

Thứ hai, mỗi khi bạn gặp vấn đề trong thiết kế, đóng nó lại và xây dựng lại dự án của mẫu của bạn. Xác minh lỗi và cảnh báo trong danh sách lỗi Cửa sổ. Sau khi sửa nó, mở lại biểu mẫu của bạn ở chế độ desig.

+0

tôi chỉ có InitializeComponents trong hàm tạo – tal

+0

xem các chỉnh sửa cuối cùng của tôi trong câu trả lời. – serhio

+0

Tôi đã có cùng cảnh báo này "biến là không khai báo hoặc không bao giờ được gán" cho biến được khai báo và gán trong VS 2010 Windows Service nhắm mục tiêu .NET 4 và thực hiện việc này "mỗi khi bạn gặp sự cố trong trình thiết kế, đóng và xây dựng lại dự án của biểu mẫu của bạn. " đã chăm sóc vấn đề cho tôi. Cảm ơn serhio. –

4

Tôi tìm thấy một giải pháp làm việc:

Vấn đề đầu tiên đã xảy ra khi điều khiển tùy chỉnh của tôi và hộp thoại là trong một file DLL/dự án/lắp ráp.

Tôi tạo ra một tách kiểm soát DLL Windows cho tất cả các điều khiển tùy chỉnh và ... các nhà thiết kế đã cho thấy hộp thoại.

3

Tôi tin rằng tôi đã thấy cùng một vấn đề và tôi nghĩ rằng đó là một lỗi trong VS. Bây giờ và sau đó (tôi không chắc chắn về hoàn cảnh chính xác), thậm chí tạo ra một hình thức hoàn toàn mới và trống rỗng và thêm một điều khiển tùy chỉnh duy nhất sẽ gây ra các nhà thiết kế để thổi lên trong cách bạn mô tả. Sao chép và dán mã cho điều khiển tùy chỉnh vào một dự án trống hoàn toàn mới và thêm nó vào biểu mẫu mới, sự cố không xuất hiện.

Các nhà thiết kế chỉ không tạo ra dòng gần đầu InitializeComponent():

this.customControl1 = new Controls.CustomControl(); 

Trong thực tế, nếu tôi tự chèn dòng trên nó được lấy ra khi dự án được xây dựng lại.

Nhìn lại các dự án trước đây của tôi, tôi có thể nhìn thấy các lỗi đã có mặt trong VS2005 và tôi vẫn nhận được nó ngày hôm nay trong VS2010. Mã trước đây của tôi được xếp chồng lên nhau bằng các bit như sau:

public MyForm() 
{ 
    // HACK: work around VS bug 
    this.customControl1 = new Controls.CustomControl(); 
    InitializeComponent(); 
} 

Không cần phải nói, nhà thiết kế làm việc hầu hết thời gian. Tôi đã không tìm thấy bất kỳ cách nào để tái tạo vấn đề một cách thú vị, nhưng thú vị là xóa một biểu mẫu khỏi giải pháp và tạo lại một hình thức có cùng tên + điều khiển tùy chỉnh, vấn đề vẫn còn đó.

2

Lỗi này cũng xảy ra đối với một trong các biểu mẫu của chúng tôi và chúng tôi đã có một thời gian thực sự khó khăn để chẩn đoán nguyên nhân gây ra lỗi đó.Mã biểu mẫu thực sự có trong các tệp .cs 3x. Các form.cs cơ bản, các designer.cs và biểu mẫu đã được mở rộng (nó đã được khai báo là một lớp từng phần).

Vì vậy MyForm.cs:

namespace MyNamespace 
{ 
    public partial class MyForm : Form 
    { 
     // Some variable declarations 

     // Some method declarations 
    } 
} 

MyForm.designer.cs:

namespace MyNamespace 
{ 
    partial class MyForm 
    { 
     #region Auto Generated 
     protected override void Dispose(bool disposing) 
     { 
      // Generated dispose code here 
     } 

     private void InitializeComponent() 
     { 
      // Generated designer code here 

      // Error 'The variable <variable name> is either undeclared or was never assigned' points to one of the lines in here. 
     } 

     #endregion 
    } 
} 

MyForm.Extended.cs:

namespace MyNamespace 
{ 
    public partial class MyForm 
    { 
     // Some variable declarations 

     // Some method declarations 
    } 
} 

gì vấn đề là đối với trường hợp này là các khai báo biến cho các biến trong InitializeComponent của nhà thiết kế phải xảy ra trong tệp .designer.cs và không nằm trong bất kỳ tệp nguồn nào khác. Vì vậy, khi nó nói biến số hoặc là không khai báo nó có nghĩa là nó không được khai báo trong phạm vi nhà thiết kế đang tìm kiếm nó.

Có vẻ như ai đó đã quyết định chuyển các khai báo biến thành một trong các tệp lớp học một phần khác và không nhận ra rằng ngắt trình thiết kế.

+0

Lưu ý: trong trường hợp của tôi, lệnh gọi phương thức mới của điều khiển tùy chỉnh không có trong phương thức InitilaizeComponent trong tệp designer.cs. – Jeff

1

Như những người khác đã nói, bạn không nên có bất kỳ logic phức tạp nào trong hàm tạo của điều khiển người dùng.

Về lý thuyết, nơi để thực hiện bất kỳ khởi tạo phức tạp nào là trình xử lý sự kiện Load hoặc OnLoad(). Tuy nhiên, trong VS2010, sử dụng sự kiện Load của điều khiển (hoặc OnLoad()) là không đủ.

Nếu UserControl của bạn đang ở trong cùng một cụm như biểu mẫu đang sử dụng nó và bạn muốn xem biểu mẫu trong Nhà thiết kế, VS2010 không chỉ thực thi hàm tạo của UserControl, mà còn là OnLoad() hoặc Tải sự kiện. Điều này dường như không xảy ra luôn, nhưng khi Nhà thiết kế cần xây dựng lại biểu mẫu. Vì vậy, nếu bạn có bất kỳ logic phức tạp nào hoặc sử dụng tài nguyên bên ngoài, như cơ sở dữ liệu, nó có thể ném lỗi này khi mở Trình thiết kế cho biểu mẫu kèm theo. Điều này là xấu vì việc sử dụng sự kiện Tải phải là nơi thích hợp để thực hiện.

Bạn có thể phải sử dụng khởi tạo lười biếng cho bất kỳ tài nguyên quan trọng nào mà bạn phải khởi tạo trước khi chạy biểu mẫu.

ví dụ .:

public class MyUserControl: UserControl 
{ 
    ... 

    private List<MyObject> myObjects = null; 
    private List<MyObject> MyObjects 
    { 
     get 
     { 
      if (myObjects == null) 
      { 
       // lazy initialisation here 
       using (var dbContext = new MyVerySpecialDatabaseContext()) 
       { 
        myObjects = dbContext.MyObjects.ToList(); 
       } 
      } 
      return myObjects; 
     } 
    } 

    public MyUserControl() 
    { 
     InitializeComponent(); 

     this.Load += new System.EventHandler(this.MyUserControl_Load); 

     ... // more UI initialization, but no complicated logic here 
    } 

    private void MyUserControl_Load(object sender, EventArgs e) 
    { 
     this.myDataBindingSource.DataSource = MyObjects; 
    } 
} 
0

Đó là một lỗi trong IDE. Không có vấn đề làm thế nào bạn nhìn vào nó, có một cách undeterminstic constructor sẽ khởi tạo các lĩnh vực của bạn và có họ được sử dụng như là tĩnh sau này trong constructor.

Ví dụ:

private ComponentResourceManger resources = null; 

private void InitializeComponent() { 
    resources = new ComponentResourceManager(typeof(MainForm)); 
    ... 
} 

sẽ thường phá vỡ thiết kế của bạn. Đôi khi nó hoạt động, nhưng thông thường nó bị nhầm lẫn .. có thể đổi tên tất cả các tài nguyên nhúng của bạn hoặc thậm chí loại bỏ chúng. Nó có ý nghĩa để có một bản sao của một hình ảnh trong tập tin .resx của bạn, nhưng các nhà thiết kế thích nhìn thấy một cho mọi điều khiển. Ngay cả khi nó được chia sẻ .. nó thích tạo một bản sao.

Lỗi điển hình bao gồm, "Không thể tìm thấy 'MainForm'" và sau đó xuống .. lấy một số NPE cho tài nguyên.GetObject ("MyImage"); Thậm chí nếu .resx có nó với tên tệp chính xác được chỉ định.

Giải pháp thay thế thường luôn được đảm bảo để hoạt động nếu bạn thiết lập obj trong quy trình InitializeComponent().

private void InitializeComponent() { 
    ComponentResourceManager resources = new ComponentResourceManager(typeof(MainForm)); 
    ... 
} 

Làm thế nào bạn sẽ tham chiếu điều này bên ngoài tùy thuộc vào bạn.

0

Trong trường hợp của tôi phụ thuộc vào nền tảng tôi xây dựng dự án. Đối với x86 mọi thứ đều đúng, nhưng đối với x64 tôi nhận được lỗi này. Vì vậy, giải pháp của tôi là phát triển dự án theo Debug/x86 và sau đó xây dựng nó cho tất cả các nền tảng đích cần thiết.

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