1

現在、xml からフォームを動的に作成する C# プログラムを作成しています。現在の xml には、必要な 67 個の文字列が含まれています。ただし、for ループが 34 または 35 に達すると、null が返されます。コードは以下です

for(int x =0; x < 67: x++){
CheckBox sue = (CheckBox)GetChildAtPoint(new Point(760, loc));
loc = loc + 20;
          }

フォームを手動で確認したところ、そこに何かがあり、最新のフレームワークを使用しています。チェックボックスとラベルを動的に投稿するために使用されるコードも投稿しています。

 for (int x = 0; x < cnt; x++)
        {

            /*creating the form*/
            String edit = "e1";
            String template = "t1";
            this.Controls.Add(new Label() {Text = data[x], Width=540,     Name = x.ToString(), Location = new Point(20, loc) });
            this.Controls.Add(new CheckBox() {Checked = true, Width = 20, Name = edit, Location = new Point(560, loc) });
            this.Controls.Add(new CheckBox(){ Width = 20, Name = template, Location = new Point(760, loc)});


            loc = loc + 20; 


        }

私には論理的に聞こえる唯一のことは、GetChildAtPoint には制限があり、xml 形式はエンタープライズ サイトの標準の site.xml ファイルであるということです。とにかくこれを完了することは私を大いに助けます。

4

2 に答える 2

0

はい、GetChildAtPoint は可視領域に対してのみ機能します。マウスの位置で使用することをほとんど意図しています。

別の方法を検討する必要があると思います:

for (int i = 0; i < 67; ++i) {
  foreach (CheckBox c in this.Controls.OfType<CheckBox>()) {
    if (c.Bounds.Contains(new Point(0, loc))) {
      // do something
    }
  }
  loc += 20;
}

20 ピクセルではオーバーラップが発生する可能性があるため、コントロールの高さを設定することを検討してください。

もう 1 つの方法は、コントロールの名前を確認することです。

for (int i = 0; i < 67; ++i) {
  string checkName = "CheckBox" + i.ToString();
  if (this.Controls.ContainsKey(checkName)) {
    CheckBox checkBox = this.Controls[checkName] as CheckBox;
  }
}

ビルダーに追加する必要があるもの:

this.Controls.Add(new CheckBox() { Name = "CheckBox" + i.ToString(), etc...
于 2013-04-03T16:22:00.397 に答える