【问题标题】:Convert all characters of a string to uppercase, except for some specific characters将字符串的所有字符转换为大写,除了某些特定字符
【发布时间】:2017-05-16 11:05:09
【问题描述】:

我试图阻止某些字符为大写,而其他所有字符都必须为大写。

例如,如果我在文本框中写一些东西,它会自动将所有字符写成大写,但每次我输入字母“k”时,它必须是小写。

有人知道实现这一目标的方法吗?

private void textBox3_TextChanged(object sender, EventArgs e)
{
    // Navn/Name Text Box 


}

【问题讨论】:

  • 我建议下次在问题中添加“winforms”标签,这样人们就可以更容易地知道是 WPF、Winforms、ASP.NET、Silverlight 等。
  • 其实我认为更重要的部分是修改字符串,而不是将结果写入文本框。所以我不会认为'winforms'标签是必要的......
  • @wkl 这就是为什么我会说这个问题太宽泛了。它问了两个问题。第一个是“如何有选择地更改字符串中字符的大小写?”,另一个是“如何在用户键入时更改 WinForms 文本框中的文本?”.我也相当确定这两个问题也已分别提出。
  • @bradbury9 好点!我对 C# 世界很陌生,所以对我来说一切都不是那么直截了当:D 但我会记住这一点。祝你新年快乐!

标签: c# winforms textbox uppercase lowercase


【解决方案1】:

在您的 textBox3_TextChanged 事件处理程序中,您可以简单地“更正”文本并将其重新设置。
您必须记住光标位置(和选择),以便用户在键入时不会被打断:

private void textBox3_TextChanged(object sender, EventArgs e)
{
    int start = textBox3.SelectionStart;
    int length = textBox3.SelectionLength;
    textBox3.Text = textBox3.Text.ToUpper().Replace("K", "k");
    textBox3.SelectionStart = start;
    textBox3.SelectionLength = length;
}

注意:这是针对 Windows.Forms 的。我猜对于 wpf 或 asp 或其他 ui 框架,带有光标处理的部分会有所不同。

【讨论】:

    【解决方案2】:

    这里有一种方法

    private void textBox3_TextChanged(object sender, EventArgs e)
    {
        textBox3.Text = new string(textBox3.Text.Select(x => x == 'k' || x == 'K' ? 'k' : char.ToUpper(x)).ToArray());
    }
    

    【讨论】:

      【解决方案3】:
      1. 首先,保持插入符号的位置 - 光标所在的位置。
      2. 然后,您计算新字符串 - 我提取了条件以防它不只是 1 个字母。
      3. 最后,保存新字符串,并将插入符号返回到它的位置。

        private static bool CalculateConditionForLowerCase(string stringLetter)
        {
            return stringLetter.ToLower() == "k";
        }
        
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text))
            {
                return;
            }
            var caretPosition = textBox1.SelectionStart;
            var sb = new StringBuilder();
            foreach (var letter in textBox1.Text)
            {
                var stringLetter = letter.ToString();
                sb.Append(CalculateConditionForLowerCase(stringLetter) ? stringLetter.ToLower() : stringLetter.ToUpper());
            }
            textBox1.Text = sb.ToString();
            textBox1.SelectionStart = caretPosition;
        }
        

      【讨论】:

        【解决方案4】:

        如果您不想让用户输入无效输入,您可以使用 TextChanged 事件(其他答案)或处理 KeyDown 和 KeyUp 事件。检查此链接以了解其他方法。

        https://msdn.microsoft.com/en-us/library/ms171537(v=vs.110).aspx

        【讨论】:

        • 不,您不要使用 KeyDown 和 KeyUp 事件进行输入验证。人们可以使用鼠标更改文本(拖动它,或通过上下文菜单剪切或粘贴),除了通过键盘或鼠标之外,还有其他方法可以修改控件的内容。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-19
        • 1970-01-01
        • 2011-12-21
        • 2011-11-30
        • 2011-05-01
        • 1970-01-01
        • 2018-09-16
        相关资源
        最近更新 更多