2009-04-15 57 views
6

Tôi đang cố gắng để có được một UserControl (trong đó có một lưới trên nó) trên một Windows Form để thay đổi kích cỡ. Mã dưới đây là những gì tôi có trong Biểu mẫu. Các hành vi tôi nhận được là kiểm soát được thay đổi kích cỡ khi tôi làm cho nó lớn. Nhưng nó không co lại. Tôi đang làm gì sai (hoặc) Tôi đang thiếu gì?Không thể sửa đổi biểu thức vì nó không phải là một biến

private void AdjustGrid() 
{ 
    ZoomControl.Location = new Point(5, 5); 
    ZoomControl.Size = new Size(this.Width - 15, this.Height - 75); 
} 

void zoomform_Resize(object sender, EventArgs e) 
{ 
    AdjustGrid(); 
} 

Bây giờ điều khiển người dùng có đoạn mã sau:

//Resize the grid that the UserControl has on it 
private void NameValuePropertyBag_Resize(object sender, EventArgs e) 
{ 
    grdNameValueProperties.Location = new Point(4,4); 
    grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8); 
} 

tôi đã cố gắng

grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

Nó mang lại cho tôi "Không thể sửa đổi biểu hiện bởi vì nó không phải là một biến" lỗi. .. Tôi đang thiếu gì?

bổ sung Thông tin:

Tôi đang sử dụng SetParent() của Windows gọi để di chuyển/phóng to một UserControl khác Form (ZoomForm). Neo dường như không hoạt động đối với các điều khiển được di chuyển với SetParent() ... Chính xác hơn, nó có thể đang hoạt động nhưng tôi có vấn đề sơn lại.

tôi đã cố định/Dock cặp để làm việc mà không vấn đề repaint [tôi loại bỏ các thay đổi kích thước kiện wireup và điều chỉnh Dock để Điền]

Các ZoomForm initally không có người điều khiển. Các Usercontrol được thêm vào ParentForm động.

Hiện tại, tôi có thể làm cho biểu mẫu thu phóng lớn hơn bằng mã ở trên nhưng không nhỏ hơn.

+0

Tại sao bạn không chỉ sử dụng thuộc tính neo thay vì mã để đổi kích thước? – recursive

+0

@recursive: Tôi đang sử dụng SetParent() Windows gọi để di chuyển/thu phóng UserControl sang một Biểu mẫu khác (ZoomForm). Neo dường như không làm việc cho điều khiển di chuyển với SetParent() ... Chính xác hơn, nó có thể làm việc nhưng tôi có vấn đề sơn lại –

Trả lời

1

Bạn không thể trực tiếp thay đổi thuộc tính Size.Width trên UserControl, vì thuộc tính Size là một loại giá trị, vì vậy việc thay đổi chiều rộng về cơ bản sẽ ghi đè toàn bộ thuộc tính Size. Thay vào đó, điều khiển trong WinForms cung cấp Width và Height thuộc tính riêng của họ, do đó, mã này nên làm việc:

grdNameValueProperties.Width = this.Width - 8; 
grdNameValueProperties.Height = this.Height - 8; 

Có nói rằng, tôi đồng ý với bình luận @ đệ quy của mà bạn nên có lẽ chỉ sử dụng tài sản Anchor của usercontrol để làm cho nó " tự động "thay đổi kích thước.

+0

@Matt: Cảm ơn ... Tôi đã loại bỏ các bài tập Size() mới. Tôi vẫn có cùng một vấn đề: Tôi có thể làm cho hình thức lớn hơn nhưng không nhỏ hơn: ( –

+0

Sự kiện Resize nào bạn đang nắm bắt? Sự kiện trên một điều khiển mà UserControl ngồi? Bạn có thể nắm bắt sự kiện Thay đổi kích thước của biểu mẫu thay thế không? –

7
grdNameValueProperties.Size.Width = this.Width - 8; 
grdNameValueProperties.Size.Height = this.Height -8; 

Mã đó cung cấp lỗi vì Kích thước là loại giá trị, không phải là loại tham chiếu. Đọc số http://www.yoda.arachsys.com/csharp/parameters.html này có thể giúp giải thích sự khác biệt giữa các loại giá trị và loại tham chiếu.

4

Khi nhận xét đệ quy, bạn chỉ nên sử dụng thuộc tính Neo.

Lỗi xảy ra do thuộc tính Kích thước hiển thị cấu trúc chứ không phải loại tham chiếu. Thuộc tính Size trả về một bản sao của đối tượng kích thước của điều khiển. Viết cho các thuộc tính Width và Hight của bản sao này không có ý nghĩa bởi vì nó chỉ là một bản sao tạm thời và không được hỗ trợ bởi bộ nhớ ở bất cứ đâu.

+0

@danbruc: Đây không phải là lần đầu tiên tôi bị SOOO câm. Cảm ơn vì đã bồi dưỡng :) –

0

Đối với phần đầu tiên -

Trước hết, tôi khuyên bạn nên sử dụng thuộc tính Neo trên UserControl thay vì cố gắng tự định kích thước này.Nó hoạt động rất đơn giản và rất đáng tin cậy, để xử lý thay đổi kích thước cửa sổ.

Nếu bạn muốn thực hiện việc này, có thể bạn nên xem xét việc xóa chuỗi này.ClientSize thay vì this.Height và this.Width. Bạn có thể thiết lập kiểm soát của bạn quá lớn, và đó là unachoring bảng điều khiển hoặc điều khác mà bạn đang ngồi trên, gây ra tất cả các loại vấn đề.

Phần thứ hai là do thực tế là gridNameValue Properties.Size.Width là thành viên của cấu trúc.

Khi bạn gọi gridNameValueProperties.Size, bạn đang trả về cấu trúc Kích thước, sau đó cố gắng đặt Chiều rộng trên cấu trúc trả về (không phải là bản gốc). Đây là lý do tại sao bạn cần phải đặt toàn bộ kích thước valuetype trong một lần chụp. Tạo một Size mới() và thiết lập nó thành gridNameValueProperties.Size là cách duy nhất để thực hiện công việc đó.

+0

@Reed: Kích thước thay đổi. UserControl và các điều khiển con của nó trở nên lớn hơn nếu tôi thay đổi kích thước biểu mẫu (làm cho nó lớn hơn, đó là). Các hình thức sẽ không cho phép tôi làm cho nó nhỏ hơn mặc dù. –

+0

Bạn có bất cứ điều gì khác trên biểu mẫu của bạn ngoài UserControl không? Nếu có một thùng chứa khác trong biểu mẫu mà người dùng kiểm soát, và bạn đặt điều khiển người dùng "quá lớn" cho vùng khách hàng của hte, tôi đã thấy hành vi này. Đó là lý do tại sao tôi đề nghị đổi thành ClientSize. –

1

Hiện tại, tôi có thể phóng to biểu mẫu thu phóng bằng mã ở trên nhưng không nhỏ hơn.

Một số điều khiển có thuộc tính MinSize (hoặc tương tự) trên chúng. Bạn có bất kỳ của những thiết lập như vậy mà bạn không thể thay đổi kích cỡ nhỏ hơn?

+0

@JP: Đã kiểm tra xem ... Có vẻ như không phải vấn đề ... Cảm ơn –

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