2009-04-15 12 views
6

サイズ変更するために、Windowsフォーム上にUserControl(グリッドがあります)を取得しようとしています。 以下のコードは私がフォームに書いたものです。私が得意とする動作は、コントロールを大きくするとコントロールのサイズが変更されるということです。しかし、それは縮小しません。私は何が間違っているのですか(または)私は何が欠けていますか?式が変数ではないため、式を変更できません

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(); 
} 

今すぐユーザーコントロールは、次のコードがあります

//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); 
} 

を、私はそれはエラー私は「それは変数ではないので、表現を変更できません」を与える

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

を試してみました。 ..私は何が欠けていますか?

追加情報:

私は別のフォーム(ZoomForm)に、ユーザーコントロールをズーム/移動するSetParent関数()のWindows呼び出しを使用しています。 SetParent()で移動したコントロールではアンカーが動作しないようです...もっと正確には動作している可能性がありますが、問題を再描画しています。

私は問題を再描画せずに作業にアンカー/ドックのペアを持ってZoomFormがinitally一切のコントロールを持っていない

[私は記入しresizeイベントwireupと調整ドックを削除]。 UsercontrolはParentFormに動的に追加されます。

現在のところ、ズームフォームを上記のコードで大きくても小さくすることはできません。

+0

なぜコードの代わりにアンカープロパティを使用してサイズを変更するだけですか? – recursive

+0

@再帰的:SetParent()Windowsコールを使用して、別のフォーム(ZoomForm)にUserControlを移動/ズームしています。 AnchorはSetParent()で移動したコントロールでは動作しないようです...もっと正確には動作しているかもしれませんが、問題を再描画しています –

答えて

1

あなたはSizeプロパティが値型であるため、直接、ユーザーコントロール上のSize.Widthプロパティを変更することはできませんので、その幅を変更することは、本質的に全体Sizeプロパティを上書きすることになります。代わりに、リサイズのコントロールは、自分の幅と高さの特性を提供するので、このコードは動作するはずです:

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

は、私はあなたがおそらくそれを作るためにUserControlのAnchorプロパティを使用する必要があること、@の再帰さんのコメント」に同意、と述べました自動的に "サイズ変更します。

+0

@Matt:ありがと...新しいSize()割り当てを取り除きました。私はまだ同じ問題があります:私はフォームを大きくすることができますが小さくはありません:( –

+0

どのResizeイベントを捕まえていますか?UserControlが座っているコントロールのイベント?フォームのResizeイベントを捕捉できますか? –

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

Sizeは値型であり参照型ではないため、このコードではエラーが発生します。このhttp://www.yoda.arachsys.com/csharp/parameters.htmlを読むと、値の種類と参照の種類の違いを理解するのに役立ちます。

4

再帰的なコメントとして、Anchorプロパティを使用するだけです。

Sizeプロパティが参照型ではなく構造体を公開するため、エラーが発生します。 Sizeプロパティは、コントロールのサイズオブジェクトのコピーを返します。このコピーのプロパティWidthとHightへの書き込みは、一時的なコピーであり、メモリのどこにもバックアップされていないため、意味をなさない。最初の部分については

+0

@danbruc:とにかくリフレッシャーに感謝します:) –

0

-

まず第一に、私は自分自身をユーザーコントロールにアンカープロパティを使用して、代わりのサイズにこれをしようとお勧めします。これは非常に簡単に、非常に信頼性の高い、ウィンドウのサイズ変更を処理するために動作します。

これを行うには、this.Heightおよびthis.Widthの代わりにthis.ClientSizeを連鎖させることをお勧めします。あなたはおそらくあなたのコントロールを大きくするように設定しています。それはあなたが座っているパネルや他のものには何の影響も与えません。

2番目の部分は、gridNameValue Properties.Size.Widthが構造体のメンバーであるためです。

gridNameValueProperties.Sizeを呼び出すと、Size構造体を返してから、元の構造体ではなく、返された構造体にWidthを設定しようとしています。このため、Sizeの全体の値型をワンショットで設定する必要があります。新しいSize()を作成し、それをgridNameValueProperties.Sizeに設定することは、その作業を行う唯一の方法です。

+0

@Reed:サイズは変わります。フォームのサイズを変更すると、UserControlとその子コントロールが大きくなります(サイズを大きくする、つまり大きくする)。私はそれを小さくすることはできません。 –

+0

フォームにUserControl以外のものがありますか?ユーザーコントロールが入っているフォームに別のコンテナがあり、hteクライアントエリアにユーザーコントロールを「大きすぎます」と設定した場合は、この動作を確認しました。だから私はClientSizeへの変更を提案した。 –

1

現在のところ、上記のコードでズームのサイズを大きくすることはできますが、小さくすることはできません。

一部のコントロールには、MinSize(または同様の)プロパティがあります。あなたが小さくサイズを変更できないようなものがありますか?

+0

@JP:チェックしてください...問題ではないようです...ありがとう –

関連する問題