如何使 TextBox 随着用户的输入不断更新?
How to make TextBox continually update with user's input?
我的表单中有一个 TextBox
,用户应该在那里输入一些字符串。
每2个字符后,它应该会自动在其中添加一个"|"
。但我不知道该怎么做。这是我的代码:
private void textBox1_TextChanged(object sender, EventArgs e)
{
string input = textBox1.Text; int count = 0;
foreach (char c in input)
{
count++;
if (count == 2)
{
input += '|';
count = 0;
textBox1.Text = input;
}
}
}
- 用户只能输入十六进制字符(即0-9,a-f)。
我已经在 Keypress
事件上尝试了 e.Keychar
,但它不起作用,如果用户使用 Copy-Paste
和 Ctrl-C
,Ctrl-V
.
避免CTRL
按键。
if (e.Control == true)
{
MessageBox.Show("Cut/Copy and Paste Options are disabled");
}
如果你真的不需要,你不应该处理 TextChanged
事件,但你应该依赖 MaskedTextBox
,它正是为此目的而构建的。
你可以找到一个很好的演练 here on MSDN。
基本上你应该设置Mask
属性。您甚至可以使用 sort of regular expressions as a mask 来确保只输入您允许的值。
'how-to':
创建一个MaskedTextBox
控件并将掩码设置为&&\|&&\|&&\|&&\|&&
('&'表示任何ASCII字符,根据需要重复\|&&
)。然后创建一个 TextChanged
事件并将事件处理程序设置为:
void maskedTextBox1_TextChanged(object sender, System.EventArgs e)
{
string input = this.maskedTextBox1.Text;
StringBuilder outputBuilder = new StringBuilder(input.Length);
char[] allowedCharacters = new char[] { '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
foreach (char c in input)
{
if (allowedCharacters.Contains(c))
{
outputBuilder.Append(c);
}
}
string output = outputBuilder.ToString();
if (!input.Equals(output))
{
this.maskedTextBox1.Text = output;
}
}
第1题算法解法
检查索引是否为偶数且 > 0 并将字符向左移动以使 '|' 为 space字符.
for (int i=0; i<input.length; i++)
{
var c = input[i];
if (i % 2 == 0 && i>0)
{
for(int j=input.length-1; j>=i; j++) input[j+1] = input[j];
input[i] = '|';
textBox1.Text = input;
}
}
确保你有足够的 space 输入(如果它是原始类型集合)
您当前代码的一个问题是,即使您以编程方式更新文本框,文本更改事件也会触发。避免这种情况的一种方法是检测文本更改何时由您引起。在下面的示例中,我通过检查“|”是否完成了此操作距字符串末尾 2 个字符以内。
使用 StringBuilder 逐步构建字符串以避免生成多个 String 对象。
如果您真的想进行那一点优化,可以将 mod 操作替换为提取最低有效位的掩码。
private void textBox1_TextChanged(object sender, EventArgs e)
{
string input = textBox1.Text;
// did I cause this event to fire? if not, parse the input
if (input.LastIndexOf("|") < input.Length - 2)
{
input = input.Replace("|", "");
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < input.Length; i++)
{
stringBuilder.Append(input[i]);
if (i % 2 == 1)
{
stringBuilder.Append("|");
}
}
textBox1.Text = stringBuilder.ToString();
textBox1.Select(textBox1.Text.Length, 0);
}
}
我的表单中有一个 TextBox
,用户应该在那里输入一些字符串。
每2个字符后,它应该会自动在其中添加一个"|"
。但我不知道该怎么做。这是我的代码:
private void textBox1_TextChanged(object sender, EventArgs e)
{
string input = textBox1.Text; int count = 0;
foreach (char c in input)
{
count++;
if (count == 2)
{
input += '|';
count = 0;
textBox1.Text = input;
}
}
}
- 用户只能输入十六进制字符(即0-9,a-f)。
我已经在 Keypress
事件上尝试了 e.Keychar
,但它不起作用,如果用户使用 Copy-Paste
和 Ctrl-C
,Ctrl-V
.
避免CTRL
按键。
if (e.Control == true)
{
MessageBox.Show("Cut/Copy and Paste Options are disabled");
}
如果你真的不需要,你不应该处理 TextChanged
事件,但你应该依赖 MaskedTextBox
,它正是为此目的而构建的。
你可以找到一个很好的演练 here on MSDN。
基本上你应该设置Mask
属性。您甚至可以使用 sort of regular expressions as a mask 来确保只输入您允许的值。
'how-to':
创建一个MaskedTextBox
控件并将掩码设置为&&\|&&\|&&\|&&\|&&
('&'表示任何ASCII字符,根据需要重复\|&&
)。然后创建一个 TextChanged
事件并将事件处理程序设置为:
void maskedTextBox1_TextChanged(object sender, System.EventArgs e)
{
string input = this.maskedTextBox1.Text;
StringBuilder outputBuilder = new StringBuilder(input.Length);
char[] allowedCharacters = new char[] { '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
foreach (char c in input)
{
if (allowedCharacters.Contains(c))
{
outputBuilder.Append(c);
}
}
string output = outputBuilder.ToString();
if (!input.Equals(output))
{
this.maskedTextBox1.Text = output;
}
}
第1题算法解法
检查索引是否为偶数且 > 0 并将字符向左移动以使 '|' 为 space字符.
for (int i=0; i<input.length; i++)
{
var c = input[i];
if (i % 2 == 0 && i>0)
{
for(int j=input.length-1; j>=i; j++) input[j+1] = input[j];
input[i] = '|';
textBox1.Text = input;
}
}
确保你有足够的 space 输入(如果它是原始类型集合)
您当前代码的一个问题是,即使您以编程方式更新文本框,文本更改事件也会触发。避免这种情况的一种方法是检测文本更改何时由您引起。在下面的示例中,我通过检查“|”是否完成了此操作距字符串末尾 2 个字符以内。
使用 StringBuilder 逐步构建字符串以避免生成多个 String 对象。
如果您真的想进行那一点优化,可以将 mod 操作替换为提取最低有效位的掩码。
private void textBox1_TextChanged(object sender, EventArgs e)
{
string input = textBox1.Text;
// did I cause this event to fire? if not, parse the input
if (input.LastIndexOf("|") < input.Length - 2)
{
input = input.Replace("|", "");
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < input.Length; i++)
{
stringBuilder.Append(input[i]);
if (i % 2 == 1)
{
stringBuilder.Append("|");
}
}
textBox1.Text = stringBuilder.ToString();
textBox1.Select(textBox1.Text.Length, 0);
}
}