如果TextBox.Text =在焦点离开时为空,则自动删除TextBox和标签

时间:2013-05-02 18:49:50

标签: c# winforms textbox label runtime

我有代码,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因为我收到错误,说它在实际代码中不存在

TextBoxDelete时,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(如果LabelFocus),则会在运行时创建1 - TextBox当前.Text和旁边Empty :仅当我使用鼠标点击Windows窗体的任何部分时,它才有效,但是如果我使用TextBox上的标签离开Focus,则它不起作用,崩溃并返回错误。 2 - 添加Button保存功能以检查创建的最后TextBox是否为空,如果是,它将在运行时Delete(侧面)中最后创建TextBox/Label,调整窗体大小并更改Button本地化(可以使用我开发的当前Delete代码进行这些更改)

就是这样,但我知道它很难理解,我会尝试,但它真的很大,不可能理解/修复,却不知道整个代码是如何工作的。

1 个答案:

答案 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(请参阅msdndotnetperls)将嵌套的if () { if (){} else { if}更改为更简单的内容。从我给你的代码我可以看出,如果你使用标签和文本框的通用列表,你可能会删除很多代码。

string textBoxName = _text.Name;
switch (textBoxName)
{
    case "txtAcessorio2": 
        c= 3;
        break;
    case "txtAcessorio3":
        c=4;
        break;
    default:
        c=0;
        break;
}