首页 > 解决方案 > 如何在实时模式下单击鼠标更改文本框位置?

问题描述

TextBox在实时模式下创建了一个,并想补充一点,它的位置可以用鼠标更改。我遇到的问题是,在生成 之后TextBox,我无法在其上执行代码。

这是我的代码:

int Naslov_rnd;

private void Naslov_p_Click(object sender, EventArgs e)
{
    Naslov_rnd++;

    TextBox tb = new TextBox();

    tb.Location = new Point(0, 0);
    tb.Width = 200;
    tb.Height = 20;
    tb.BorderStyle = BorderStyle.None;

    tb.BackColor = Color.DodgerBlue;
    tb.ForeColor = Color.White;

    tb.Name = "Naslov_" + Naslov_rnd.ToString();
    tb.Text = "Dodajte Vaš naslov";
    tb.Font = new Font("Microsoft Sans Serif", 12);

    VizitKartica.Controls.Add(tb);
    elementi_lista.AddItem(tb.Name);

    tb.MouseMove += new MouseEventHandler(tb_MouseMove);
    tb.MouseDown += new MouseEventHandler(tb_MouseDown);
}

protected void tb_MouseDown(object sender, EventArgs e)
{       
}

protected void tb_MouseMove(object sender, EventArgs e)
{          
}

标签: c#visual-studio

解决方案


我建议查看TextBox. 在示例部分中,它们SuspendLayout在更改TextBox的属性之前调用ResumeLayout,并PerformLayout在将表单添加到Controls集合之后调用。请注意PerformLayout(),您可以直接调用,而不是调用ResumeLayout(true)

和方法串联使用以在您调整控件的多个属性时抑制多个事件SuspendLayout。例如,您通常会调用该方法,然后设置控件的、、或属性,然后调用该方法以使更改生效。ResumeLayoutLayoutSuspendLayoutSizeLocationAnchorDockResumeLayout

另请注意:

您必须将Multiline属性设置为true以调整控件的高度TextBoxSize您可以通过设置属性来调整高度。

我会将您的Naslov_p_Click处理程序更改为:

int Naslov_rnd;

private void Naslov_p_Click(object sender, EventArgs e)
{
    TextBox tb = new TextBox();
    VizitKartica.SuspendLayout(); // Call before changing TextBox properties

    tb.Location = new Point(0, 0);

    tb.Multiline = true; // Set before changing width/height
    tb.Size = new Size(200, 20); // Use Size property

    tb.BorderStyle = BorderStyle.None;

    tb.BackColor = Color.DodgerBlue;
    tb.ForeColor = Color.White;

    tb.Name = "Naslov_" + Naslov_rnd.ToString();;
    tb.Text = "Dodajte Vaš naslov";
    tb.Font = new Font("Microsoft Sans Serif", 12);

    VizitKartica.Controls.Add(tb);
    elementi_lista.AddItem(tb.Name);

    VizitKartica.ResumeLayout(true); // Call after adding it to the Controls collection

    tb.MouseMove += new MouseEventHandler(tb_MouseMove);
    tb.MouseDown += new MouseEventHandler(tb_MouseDown);
}

编辑

如果在方法中声明变量,则不能在方法之外使用它,因为它具有局部范围。tb在方法之外声明变量Naslov_p_Click将允许您从其他方法访问它:

int Naslov_rnd;
TextBox tb; // Declare it here

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

    // ...
}

protected void tb_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
        tb.Left = e.X + tb.Left; 
        tb.Top = e.Y + tb.Top; 
    }
}

protected void tb_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
        Point MouseDownLocation = e.Location; 
    } 
}

推荐阅读