我有代码,Windows窗体只有1 Label
和1 TextBox
开始,当用户开始输入TextBox1
时,它创建一个新的TextBox并标记为down(也改变位置) 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
,虽然它不需要且不包含文字(空白),Delete
标记到TextBox7
并离开TextBox8
(不在tb8中输入文字),我会自动TextBox8
我的代码运行不正常(将在下面解释),如果我点击Button
将验证上一个TextBox
文字是否为Empty
,如果是{id},则会Delete
1}}侧面的文本框和标签,并更改Buttons
和窗体大小的本地化)。
我有太多问题,因为TextBox
2到10是在运行时创建的,并且无法在代码中引用这些“future”TextBox
因为我收到错误,说它在实际代码中不存在
当TextBox
为Delete
时,TextBox
焦点离开的TextBox.Text
和标签Empty
的问题是,如果我专注于我的另一个地方,它会很有效使用鼠标单击进行对焦,但如果我按Tab键Delete
2 TextBox
并崩溃并返回错误:索引12(可以是任意数字)超出范围。
在txtNomecategoria_TextChanged上查看我的代码以创建新的TextBox
和标签+调整大小窗体和窗体大小:
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--;
}
}
}
请注意,它会为新运行时创建的TextBox
创建2个新事件:
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
+调整大小windowsform等:
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);
}
}
}
}
它真的很难解释所有,因为代码很大,如果人们知道代码如何工作,它唯一可能解决问题。如果我需要添加任何其他信息,只要求它,它附近,但在你的帮助下,我可以尝试使其工作。
快速摘要(可以尝试嘿嘿)
我想要修复:
如果Delete
离开当前TextBox
(如果Label
为Focus
),则会在运行时创建1 - TextBox
当前.Text
和旁边Empty
:仅当我使用鼠标点击Windows窗体的任何部分时,它才有效,但是如果我使用TextBox
上的标签离开Focus
,则它不起作用,崩溃并返回错误。
2 - 添加Button
保存功能以检查创建的最后TextBox
是否为空,如果是,它将在运行时Delete
(侧面)中最后创建TextBox/Label
,调整窗体大小并更改Button
本地化(可以使用我开发的当前Delete
代码进行这些更改)
就是这样,但我知道它很难理解,我会尝试,但它真的很大,不可能理解/修复,却不知道整个代码是如何工作的。
答案 0 :(得分:1)
更新:我从下方向github上传了project with my code。您可以使用sharpdevelop 4.3。
打开我的项目在Textbox的事件中,您可以调用/触发TextBox_LeaveEvent方法:
void TextBox_LeaveEvent(object sender, EventArgs e)
{
var tb = sender as TextBox;
// add another textbox if this tb has text
if(textboxList.Count<5 && tb.Text.Length>0){
var newTextBox = getNewTextBox(textboxList.Count);
textboxList.Add(newTextBox);
} // remove textbox if it has no text
else if(tb.Text.Length == 0){
RemoveTextBox(tb);
}
}
执行以下操作:
List<TextBox> textboxList = new List<TextBox>();
tb.Text.Length == 0
),则会从列表中删除它,并通过调用RemoveTextBox从Windows窗体中删除这是删除文本框的方法
void RemoveTextBox(TextBox tb){
// this.Controls.RemoveByKey(tb.Name);
int tbIndex = this.Controls.IndexOf(tb);
this.Controls[tbIndex].Dispose();
textboxList.Remove(tb);
}
这是将文本框动态添加到表单
的那个TextBox getNewTextBox(int i)
{
var tb = new TextBox();
tb.Location = new System.Drawing.Point(220, 90 + i * 24);
tb.Name = "tb_" + i.ToString();
tb.Size = new System.Drawing.Size(80,20);
tb.Text = "textbox_"+i.ToString(); //String.Empty;
tb.Leave += new System.EventHandler(this.TextBox_LeaveEvent);
this.Controls.Add(tb);
this.Refresh();
return tb;
}
从上面的代码示例中,我假设您可以使用if() else if()或使用switch(请参阅msdn或dotnetperls)将嵌套的if () { if (){} else { if}
更改为更简单的内容。从我给你的代码我可以看出,如果你使用标签和文本框的通用列表,你可能会删除很多代码。
string textBoxName = _text.Name;
switch (textBoxName)
{
case "txtAcessorio2":
c= 3;
break;
case "txtAcessorio3":
c=4;
break;
default:
c=0;
break;
}