【问题标题】:What number you deleted with backspace你用退格键删除了什么号码
【发布时间】:2015-10-14 13:27:11
【问题描述】:

当我删除带有退格键的文本框中的数字时,我想保存该数字,以便可以将其与其他文本框中的其他数字进行比较。我怎么做? 这是我要放入的代码:

List<TextBox> box1;
private void Form1_Load(object sender, EventArgs e)
    {   box1 = this.Controls.OfType<TextBox>()
              .Where(x => x.Name.StartsWith("textBox1")).ToList();

        foreach (TextBox t in box1)
            t.TextChanged += textBox_TC1;
     }

private void textBox_TC1(object sender, EventArgs e)
    {
        TextBox textBox = (TextBox)sender;
        if (textBox.Text.Length == 1 && allwhite == 0)
        {
            bool sameText = box1.Any(x => x.Text == textBox.Text &&
                                         !x.Equals(textBox));

            if (sameText)
                textBox.BackColor = System.Drawing.Color.Red;

        }
        else if (textBox.Text.Length == 0)
        {
            textBox.BackColor = System.Drawing.Color.White;
        }
    }

我想将我的新代码放在“else if (textBox.Text.Length == 0)”中,因为我只能在文本框中删除带有退格键的文本,并且最大长度为 1。 当我退格时,我想将该数字与 box1 中的所有其他文本框进行比较,然后如果该数字仅等于另一个文本框,它将使另一个文本框背景色变为白色。我不知道如何保存一个即将被删除的号码,所以如果你能帮助我,我会很高兴。

【问题讨论】:

  • 您可以存储以前的值(作为字段),当TextChanged 上升时,您可以获取以前的值,检查它是否少一个数字等。或者您可以使用另一个事件(例如@ 987654323@) 来检测按下退格键的时刻。
  • 你是想比较密码还是什么?
  • 您应该使用TextChanged 事件,在TextChanged 结束时,您应该将当前值保留在TagTextBox 属性之类的位置,并在您想与它进行比较时使用它其他值。您不应使用TextChanged 以外的任何事件,因为用户可以在不使用键盘的情况下删除或粘贴值。
  • @Sinatr 我不仅有 1 个文本框,还有 81 个在列表中,所以如果我要存储特定文本框的数字,我需要一些可以检查这些文本框是哪些列表的东西因为我所有的文本框都在 2 个不同的列表中,我有 18 个列表。而且我不知道该怎么做。
  • @RezaAghaei 哦,我错过了这一点。还是谢谢。

标签: c# .net winforms


【解决方案1】:

您应该使用TextChanged 事件来检测您的TextBox 上的更改,并且在TextChanged 结束时您应该将当前值保持在某个位置,例如TextBoxTag 属性,并在您需要时使用它将其与其他值进行比较。您不应使用TextChanged 以外的任何事件,因为用户可以在不使用键盘的情况下删除或粘贴值。

例如你可以这样写代码:

...
else if (textBox.Text.Length == 0)
{
    var previusText = textBox.Tag as string;
    var items= box1.Where(x => x.Text == previusText && !x.Equals(textBox)).ToList();
    if (items.Count()==1)
    {
        items[0].BackColor = System.Drawing.Color.White;
    }
}

//Keep previous text
textBox.Tag = textBox.Text;
...

【讨论】:

  • 此代码只使已更改为白色的框,而不是与它相同的框。而且我已经修复了您无法在没有键盘或使用 ctrl+a 或 ctrl+z 的情况下删除或粘贴值,因此您不必担心。
  • @Percutient 这是主要思想,您可以根据自己的意愿进行更改:) 我没有阅读您的所有代码。如我所见,您知道如何使用 linq 很好地查找控件,因此只需更改代码并按照您的意愿进行修改。
  • @Percutient 但你得到的主要思想是使用TextChanged 事件并在Tag 中保留以前的值。
  • @Percutient 你现在可以检查编辑后的答案了:)
  • 我了解到您的代码试图将之前的文本放入 textBox.Tag。但是当你输入'x.Text == previusText'时,x.text 已经是空的,所以 previusText 也是一个空字符串,因为这一切都发生在 textBox.Text.Length 为 0 时。至少在我看来是这样,我可以想不出任何办法来解决这个问题。
【解决方案2】:

您可以使用这种方法:

static void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    TextBox t = sender as TextBox;
    switch (e.KeyCode)
    {
        case Keys.Delete:
        case Keys.Back:
            int start = e.KeyCode == Keys.Back && t.SelectionLength == 0 ? t.SelectionStart - 1 : t.SelectionStart;
            int length = t.SelectionLength == 0 ? 1 : t.SelectionLength;

            // you can save your char right here....!

            t.Text = t.Text.Remove(start, length);

            e.SuppressKeyPress = true;
            break;
    }
}

【讨论】:

  • 也许用户不使用退格或删除来删除字符,而只选择文本并键入/粘贴新字符。解决方案必须处理所有情况。
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2011-06-20
  • 2018-12-25
  • 2012-02-12
相关资源
最近更新 更多