我有 Windows 窗体仅以 1Label
和 1开头的代码TextBox
,当用户开始键入时TextBox1
,它会创建一个新的 TextBox 并向下标记(同时更改 2 的位置Buttons
并更改窗体大小,最多 10 个文本框 + 10标签(侧面)如:
(label1) Enter Name 1: - Textbox1 Imput
(label2) Enter Name 2: - Textbox2 Imput
(label1) Enter Name 3: - Textbox3 Imput
...
它工作得很好,但有一个小“问题”:
- 我的代码在用户最后开始输入时创建一个新的
TextBox
/Label
TextBox
- 例如,如果用户停下
Textbox7
来,我的代码将会创建,TextBox8
尽管它不需要并且不包含文本(为空白), - 因此,如果用户从to和离开(而不在 tb8 中输入文本)选项卡,我希望
Delete
它自动TextBox7
TextBox8
TextBox8
我的代码不能完美运行(将在下面解释),如果我点击它Button
,将验证最后一个TextBox
文本是否是Empty
,如果是,Delete
文本框和标签会在旁边并更改本地化Buttons
和窗体大小)。
我有太多问题,因为TextBox
2 到 10 是在运行时创建的,并且无法TextBox
在代码中引用这些“未来”,因为我收到错误说它在实际代码中不存在。
焦点离开时的问题TextBox
和标签是,如果我使用鼠标单击将焦点放在焦点中的另一个位置,但如果我按 Tab 2并崩溃并返回错误:索引 12(可以是任何数字)已出的范围。Delete
TextBox
TextBox.Text
Empty
Delete
TextBox
请参阅我的代码以TextBox
在 txtNomecategoria_TextChanged 上创建新标签 + 调整窗体大小和窗体大小:
public partial class cad_produto_acessorios_novo : Form
{
string testelogico;
int c;
int n = 1;
int n2 = 25;
int n3 = 65;
int n4 = 57;
int n5 = 152;
public cad_produto_acessorios_novo()
{
InitializeComponent();
}
private void txtNomecategoria_TextChanged(object sender, EventArgs e)
{
if (txtNomecategoria.TextLength > 1)
{
n++;
if (n <= 1)
{
n = 2;
}
if (n >= 1 && n <= 2)
{
n2 = n2 + 30;
n3 = n3 + 30;
n4 = n4 + 30;
n5 = n5 + 30;
gpbCategoria.Size = new System.Drawing.Size(283, n4);
this.Height = n5;
btnApagar.Location = new Point(108, n3);
btnSalvar.Location = new Point(212, n3);
TextBox txt = new TextBox();
txt.Name = "txtAcessorio" + n;
txt.Text = "";
txt.Size = new System.Drawing.Size(189, 26);
txt.Location = new Point(87, n2);
testelogico = txt.Name;
gpbCategoria.Controls.Add(txt);
txt.TextChanged += new EventHandler(new_onchange);
txt.Leave += new EventHandler(erase_onLeave);
Label lbl = new Label();
lbl.Name = "lblAcessorio" + n;
lbl.Text = "Acessório Nº" + n + ":";
lbl.Location = new Point(4, n2 + 5);
gpbCategoria.Controls.Add(lbl);
}
else
{
n--;
}
}
}
请注意,它为创建的新运行时创建了 2 个新事件TextBox
:
txt.TextChanged += new EventHandler(new_onchange);
txt.Leave += new EventHandler(erase_onLeave);
所以我们开始(创建新的TextBox/Label
+调整大小的windowsform等):
void new_onchange(object sender, EventArgs e)
{
cadeianovoscampos(sender as TextBox, e);
}
private void cadeianovoscampos(TextBox _text, EventArgs e)
{
n++;
if (_text.Text != null)
{
if (_text.Name == "txtAcessorio2")
{
c = 3;
}
else
{
if (_text.Name == "txtAcessorio3")
{
c = 4;
}
else
{
if (_text.Name == "txtAcessorio4")
{
c = 5;
}
else
{
if (_text.Name == "txtAcessorio5")
{
c = 6;
}
else
{
if (_text.Name == "txtAcessorio6")
{
c = 7;
}
else
{
if (_text.Name == "txtAcessorio7")
{
c = 8;
}
else
{
if (_text.Name == "txtAcessorio8")
{
c = 9;
}
else
{
if (_text.Name == "txtAcessorio9")
{
c = 10;
}
}
}
}
}
}
}
}
if (n >= 1 && n <= c)
{
n2 = n2 + 30;
n3 = n3 + 30;
n4 = n4 + 30;
n5 = n5 + 30;
gpbCategoria.Size = new System.Drawing.Size(283, n4);
this.Height = n5;
btnApagar.Location = new Point(108, n3);
btnSalvar.Location = new Point(212, n3);
TextBox txt = new TextBox();
txt.Name = "txtAcessorio" + n;
txt.Text = "";
txt.Size = new System.Drawing.Size(189, 26);
txt.Location = new Point(87, n2);
gpbCategoria.Controls.Add(txt);
testelogico = txt.Name;
btnSalvar.Tag = 2;
txt.TextChanged += new EventHandler(new_onchange);
txt.Leave += new EventHandler(erase_onLeave);
Label lbl = new Label();
lbl.Name = "lblAcessorio" + n;
lbl.Text = "Acessório Nº" + n + ":";
lbl.Location = new Point(4, n2 + 5);
gpbCategoria.Controls.Add(lbl);
}
else
{
n--;
}
}
}
并在文本框焦点离开时删除TextBox/Labels
+调整窗口大小等(如果为空):
void erase_onLeave(object sender, EventArgs e)
{
cadeiaapagarcampos(sender as TextBox, e);
}
private void cadeiaapagarcampos(TextBox _text, EventArgs e)
{
if (_text.Text == "")
{
n--;
if (gpbCategoria.Controls.Count < 4)
{
}
else
{
if (n >= 1 && n <= 10)
{
n2 = n2 - 30;
n3 = n3 - 30;
n4 = n4 - 30;
n5 = n5 - 30;
int count = gpbCategoria.Controls.Count - 2;
gpbCategoria.Size = new System.Drawing.Size(283, n4);
this.Height = n5;
btnApagar.Location = new Point(108, n3);
btnSalvar.Location = new Point(212, n3);
gpbCategoria.Controls.Remove(_text);
gpbCategoria.Controls.RemoveAt(count);
}
}
}
}
这真的很难解释所有,因为代码很大,只有知道代码是如何工作的,它才有可能解决问题。如果我需要添加任何其他信息,只需要求,它就在附近,但在您的帮助下,我可以尝试使其工作。
快速总结(可以试试嘿嘿)
我想要修复:1 -如果离开当前(如果是),则在运行时创建Delete
当前TextBox
和侧面:它仅在我使用鼠标单击 Windows 窗体的任何部分聚焦离开时才有效,但如果我使用选项卡离开,它只是不起作用,崩溃并返回错误。2 - 添加保存功能以检查最后创建是否为空,如果它,它将在运行时(侧面)中最后创建,调整窗口窗体大小并更改本地化(可以使用我开发的当前代码进行这些更改)Label
Focus
TextBox
.Text
Empty
TextBox
Focus
Button
TextBox
Delete
TextBox/Label
Button
Delete
就是这样,但我知道它很大而且很难理解,我会尝试但它真的很大,如果不知道整个代码是如何工作的,它不可能理解/修复。