C# 如何使文本框仅显示大写字母?

C# 如何使文本框仅显示大写字母?,c#,windows-mobile,C#,Windows Mobile,使用Windows Mobile 6.5和C# WinMo 6.5中似乎缺少CharacterCasing属性,我决定只捕获textchanged事件并使用ToUpper设置文本 这是可行的——但在每次按键时,它都会将光标发回字符串的开头,而不是结尾。我找到了答案。所以在textChanged事件中,我用ToUpper版本替换输入的文本。然后我将SelectionStart属性设置为Text.Length以将光标移动到末尾。如果您需要编辑已输入的文本,将文本位置设置到字符串末尾的解决方案似乎会很

使用Windows Mobile 6.5和C#

WinMo 6.5中似乎缺少CharacterCasing属性,我决定只捕获textchanged事件并使用ToUpper设置文本


这是可行的——但在每次按键时,它都会将光标发回字符串的开头,而不是结尾。

我找到了答案。所以在textChanged事件中,我用ToUpper版本替换输入的文本。然后我将SelectionStart属性设置为Text.Length以将光标移动到末尾。

如果您需要编辑已输入的文本,将文本位置设置到字符串末尾的解决方案似乎会很麻烦


我已经有一段时间没有考虑C#事件模型了,但是,一种替代方法可能是捕获
KeyPress
事件,并在将任何小写
KeyChar
值传递给下一个处理程序之前将其更改为大写。

Ritu,只是对您的答案进行评论。你应该记住,如果用户把插入符号放在字符串的中间来执行一些编辑,那么插入符号就会跳到按键上的字符串结尾。
另一种方法是,当编辑控件失去焦点时,将文本更改为大写。

您的处理方式似乎是错误的。
有很多不同的方法可以将数据插入到文本框中。例如,复制粘贴怎么样


在访问文本框的值时,只需执行.Text.ToUpper()即可

在更改文本之前保存SelectionStart和SelectionLength。ToUpper不应更改长度,因此您可以简单地将SelectStart和SelectionLength设置回原来的长度

另外,当你把它设置得更高时,我希望能再次得到一个改变的事件。我不确定在再次设置文本之前是否还需要检查Touper是否确实更改了任何内容。当您分配文本并避免给您一个无限循环的更改事件时,为您检查这一点可能足够聪明。但是,对于不进行进一步更改的情况,您可能不希望更改事件处理程序调用中的选择,而只希望更改正在分配回文本的外部调用中的选择。所以您最好直接保护递归

比如:

bool m_InMyTextChanged = false;  

private void txtMyText_TextChanged(object sender, EventArgs e)
{
    if (m_InMyTextChanged)
        return; // Recursive!  We can bail quickly.  

    m_InMyTextChanged = true; // Prevent recursion when we change it.
    int selectionStart = txtMyText.SelectionStart;
    int selectionLength = txtMyText.SelectionLength;
    string originalText = txtMyText.Text;
    string newText = originalText.ToUpper();
    if (newText != originalText)
    {
        txtMyText.Text = newText; // Will cause a new TextChanged event.
        // Set the selection back *after* the assignment, which has reset them.
        txtMyText.SelectionStart = selectionStart;
        txtMyText.SelectionLength = selectionLength;
    }
    m_InMyTextChanged = false; // Allow it for next time.
}

我可以工作。我没有在Windows Mobile中工作过,但我认为这与在.NET中的一般工作方式相同。

我知道这很旧,但希望这可以帮助其他人。我实现了KeyPress事件,如下所示

    private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.KeyChar = Char.ToUpper(e.KeyChar);
    }

在这里尝试这样的实现

 public MainForm()
    {
        InitializeComponent();
        InitializeUpperCaseTextBox();

    }
    private void InitializeUpperCaseTextBox()
    {
        txtbox.CharacterCasing = CharacterCasing.Upper;
        //... etc.
    }

我同意。我没有;对于未来的编辑来说,用Windows的说法,光标是屏幕上代表鼠标的图形图像。插入符号是用于输入文本的闪烁条/对象。这确实帮助了其他人,谢谢。这正是我所尝试的,但它表示:属性或索引器'System.Windows.Forms.KeyPressEventArgs.KeyChar'无法分配给--它是读取的only@downvoter(我猜这个参考并不真的有效),你应该发布一条评论,解释投票失败的原因,而不仅仅是匿名不加解释的叮当声。。。尤其是最彻底的答案,最完全地解决了原始问题(接受答案中较简单的选项在键入时不会“仅显示大写”;此答案既能保留克拉/选择,又能立即处理新输入,尽管可以进一步细化)。