-1

winform c# プロジェクトに問題があります。私のプロジェクトには 2 つの主な機能があります。1 つは実行時にボタンを作成し、もう 1 つは実行時にフォーム上のボタンを移動できるようにする機能です。他のボタンにボタンがある場合はどうすればよいので、最初はボタンの場所を置き換える機能を作成しましたが、誰かが私を助けてくれれば機能が問題になります!

public void upandunder(Button cBtn1, Button cBtn2)
    {
        if ((cBtn1.Location.X == cBtn2.Location.X) && (cBtn1.Location.Y == cBtn2.Location.Y))
        {
            int placex = cBtn1.Location.X;
            int placey = cBtn1.Location.Y;
            cBtn1.Location.X = cBtn2.Location.Y;
            cBtn1.Location.Y = cBtn2.Location.Y;
            cBtn2.Location.X = placex;
            cBtn2.Location.Y = placey;

        }
    }
4

3 に答える 3

1

errorError 1 Cannot modified the return value of 'System.Windows.Forms.Control.Location' because it is not a variable

正解Locationです。プロパティの戻り値は編集できません。ドキュメントによると:

Pointクラスは値型 ( StructureVisual Basic ではVisual C#) であるためstruct、値によって返されます。つまり、プロパティにアクセスすると、コントロールの左上点のコピーが返されます。したがって、このプロパティから返されるのXまたはYプロパティを調整しても、コントロールの、、、またはプロパティの値には影響しません。これらのプロパティを調整するには、各プロパティ値を個別に設定するか、新しい でプロパティを設定します。PointLeftRightTopBottomLocationPoint

したがって、コードを次のように書き直す必要があります:
(また、関数内で x 値と y 値を持つ座標を扱っているため、パラメータに and以外の名前を付けることを強くお勧めします...)xy

public void upandunder(Button btn1, Button btn2)
{
    if ((btn1.Location.X == btn2.Location.X) && (btn1.Location.Y == btn2.Location.Y))
    {
        Point originalLocation = btn1.Location;
        btn1.Location = btn2.Location;
        btn2.Location = originalLocation;
    }
}

またはさらに良いのは、プロパティPointによって返される2 つの値を比較することです (構造体はoperatorをオーバーロードします)。LocationPoint==

public void upandunder(Button btn1, Button btn2)
{
    if (btn1.Location == btn2.Location)
    {
        Point originalLocation = btn1.Location;
        btn1.Location = btn2.Location;
        btn2.Location = originalLocation;
    }
}

もちろん、それがどのように何かを達成するかはわかりません。最初に、ボタンが互いの上に配置されている (x 座標と y 座標がまったく同じ) ことを確認し、重なっている場合は位置を交換します。それらは既に同じ位置あります — スワッピング コードを実行する前にテストしました。

関数の名前 ( upandunder、標準の .NET 命名規則に従う必要がありUpAndUnderます) から判断すると、ボタンの Z オーダーを変更したいようです。その場合は、ボタン コントロールのBringToFrontまたはメソッドを呼び出す必要があります。SendToBack

于 2012-05-13T13:00:24.117 に答える
0

コントロールのLocationプロパティはポイントを返します。ポイント構造には、使用しているX値とY値があります。それらに直接アクセスするのではなく、新しいロケーションポイントを提供したいと思います。

これを試してみてください(私のマシンで動作します)

public void UpAndUnder(Button cBtn1, Button cBtn2)
{
    if (cBtn1.Location == cBtn2.Location.Y)
    {                
        Point oldPoint = new Point(cBtn1.Location.X, cBtn1.Location.Y);
        cBtn1.Location = new Point(cBtn2.Location.X, cBtn2.Location.Y);
        cBtn2.Location = oldPoint;
    }
}
于 2012-05-13T13:02:01.937 に答える
0

1つのボタンを他のボタンの上に配置する場合は、

button1.BringToFront();

これにより、button1のZオーダーが変更され、他のすべてのコントロールの上に配置されます。

于 2012-05-13T13:03:39.777 に答える