1

我正在做一个思维导图项目。我试图让“新气泡”按钮在表单上的空闲空间中创建一个新文本框。所以我想检查在它被创建的地方是否还有另一个气泡。如果它已经有一个文本框,那么我希望它找到一个新位置并重复该过程。

我怎样才能做到这一点?

public partial class frmMap : Form
{
    private void btnProperties_Click(object sender, EventArgs e)
    {
        new frmProperties().Show();
    }

    private void btnNewBubble_Click(object sender, EventArgs e)
    {
        var tb = new TextBox();

        tb.Multiline = true;
        tb.BorderStyle = BorderStyle.FixedSingle;
        tb.Top = 100;
        tb.Left = 200;
        tb.Size = new Size(100, 100);

        this.Controls.Add(tb);
    }
}
4

2 回答 2

1

您可以使用其他控件检查“碰撞”,如下所示:

foreach (Control checkControl in Controls)
{
   if (tb.Bounds.IntersectsWith(checkControl.Bounds))
      ...
}

当然,这需要做很多检查!如果您只是要对控件进行“网格化”,那么只需布局一个保存每个“单元格”(填充/空)状态的布尔数组,然后选择您找到的第一个空数组,会更快/更容易。

于 2014-12-23T22:25:18.047 回答
1

Create dynamic textbox:

 var tb = new TextBox();
 tb.Multiline = true;
 tb.BorderStyle = BorderStyle.FixedSingle;

 tb.Top = 100;
 tb.Left = 200;
 tb.Size = new Size(100, 100);

Then use Rectangle.IntersectWith to check if new textbox intersects with other already added texboxes (you can remove control type filter, if you have other type of controls to check):

 while(Controls.OfType<TextBox>().Any(x => tb.Bounds.IntersectsWith(x.Bounds))
 {
    // adjust tb size or position here
 }

And last step - add textbox to form:

 Controls.Add(tb);
于 2014-12-23T22:31:25.137 回答