2017-04-15 4 views
0

フォームにC#を付けたボードゲーム「ガチョウのゲーム」を作る必要があります。ポーンをその場所に移動するには

このゲームでは、プレイヤーはボタンを押してサイコロを振り、数字を作成します。

私は「totaal」と呼ばれるintとして作成された番号を格納します。そして、すべてが「AllVariable.splaats1」として結合されます。ポーンはその番号に対応する場所にある必要があります。

しかし、ポーンを動かすには最高の/最も簡単な方法は何ですか?

私はボードにラベルを貼り付けようとしていましたが、AllVariable.splaats1 = 5とするとラベル5を指し示し、ポーンはラベルの位置に移動します。

Click here the see an image

私はすでにこれをしようとした別のアプローチではなく質屋は隅にありました。

Label lbl = new Label(); 
lbl.Name = "label" + AllVariable.splaats1; 
frmkeuzespelers keuzespelers = new frmkeuzespelers(); 
picSpeler1.Location = lbl.Location; 

は、ここで私は、実行時エラーを得た:CS0029は、暗黙のうちに「System.Windows.Forms.Label」

Label lbl = "label" + AllVariable.splaats1; 
picSpeler1.Location = lbl.Location; 
+0

図の 'Location'プロパティを変更するというアイデアは大丈夫​​ですが、a)コードはコンパイルされず、最小限の検証可能な例を提供してください。b)"成功しません "は、 。あなたは、コンパイラエラー、ランタイムエラーを取得しますか? – dlatikay

+0

この例は複数試行です。私はこれを変更します。 – Kartercas

+0

私は例を分ける – Kartercas

答えて

0

に型「string」を変換できません。あなたは、「LABEL1というフォームのラベルを持っていると仮定すると、 labelX "スルー ""、あなたができる:

string lblName = "label" + AllVariable.splaats1.ToString(); 
Control[] matches = this.Controls.Find(lblName, true); 
if (matches.Length > 0 && matches[0] is Label) 
{ 
    Label lbl = (Label)matches[0]; 
    picSpeler1.Location = lbl.Location; 
} 

Thank you, it works just fine! Can you explain it a bit? – Kartercas

説明:

変数 "lblName"は、探しているラベルの名前を含む文字列です( "AllVariable.splaats1"のInteger値と連結されたリテラル値 "label"から構築されています)。

ラベル名を表す文字列値をControls.Find()に渡すと、 "lblName"の値に一致する名前のコントロールの配列が返されます。その呼び出しに対する2番目のパラメータの「真の」値は、深さに関係なく、ネストされたコンテナを含む一致をフォームで検索することを意味します。つまり、たとえパネル(たとえ入れ子のパネルや他のコンテナ)内にあっても、ラベルが見つかることを意味します。すべての一致は、「一致」と呼ばれる制御配列に戻されます。一致するものが見つからなかった場合、制御配列は空になり、長さはゼロになります。実行時に動的コントロールを作成し、すでに使用されている名前を与えることができるので、複数の一致が見つかる可能性が実際にあります。 Visual Studioでは、すでに使用されている名前を使用できないため、IDE経由で追加されたデザインタイムコントロールにはこの問題はありません。

"if"ステートメント行は、一致するコントロールがフォームにあり、 "matches"配列内にあることを保証し、配列内の最初のコントロールのタイプがLabelコントロールであることを保証します。複数の型が返される可能性があるため、配列は汎用コントロール型です。 TextBox、PictureBox、Label、Panelなどの名前を "groupBox1"と同じ名前にすることはできません。したがって、ラベルタイプのチェックでは、すぐ下の行のキャストが失敗しないようになっています。

"if"ブロック内の最初の行は、一致したコントロールを汎用コントロールタイプから実際にあるラベルタイプにキャストします。この参照は "lbl"と呼ばれ、Labelコントロールに固有のプロパティやメソッドにアクセスすることができます(汎用コントロールで利用可能な汎用プロパティやメソッドのみではありません)。このケースでは、 "Location()"プロパティにのみアクセスしているので、Labelタイプへのキャストは実際には必要ではありません...私はこれが将来の目的でデモンストレーションするのが良いと思っています。

"if"ブロックの最後の行は、以前に見つかった一致するLabelのLocation()にPawnのLocation()を設定することによってPawn部分を実際に動かすものです。心の中ですべてのことで

、コードは単に、この短縮されている可能性が:

Control match = this.Controls.Find("label" + AllVariable.splaats1.ToString(), true).FirstOrDefault(); 
if (match != null) 
{ 
    picSpeler1.Location = match.Location; 
} 

が、私はそれは同じように簡単初心者に理解されているとは思いません。

+0

ありがとう、それはうまく動作します! 少し説明できますか? – Kartercas