2010-04-13 108 views
0

使用Windows Mobile 6.5和C#如何让文本框只显示大写字母?

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

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

回答

4

Ritu,只是为了评论你的答案。您应该记住,如果用户将脱字符放置在字符串中间以执行一些编辑,然后脱字符跳到字符串按键的末尾,用户可能会感到困惑。

另一种可能是在编辑控件失去焦点时将文本更改为大写。

+0

我同意。我没有想到他们可能会将光标置于单词中间的情况。 – Reena 2010-04-19 17:42:50

+0

对于未来的编辑者,用Windows的说法,光标是屏幕上代表鼠标的图形图像。插入符号是用于输入文本的闪烁条/对象。 – 2014-10-03 20:51:23

-2

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

2

如果您需要编辑已输入的文本,将文本位置设置为字符串末尾的解决方案似乎是一件麻烦事。

,因为我想到了C#的事件模型,但是,一个替代方法可能是赶上KeyPress事件并更改任何小写KeyChar值将它们传递到下一个处理程序之前为大写它已经有一段时间。

0

你接近的方式似乎是错误的。
有很多不同的方法可以将数据插入到该文本框中。那么复制&粘贴呢?

访问文本框

+0

@downvoter:谨慎评论为什么? – citronas 2013-02-04 20:54:49

0

的值时()保存SelectionStart和SelectionLength改变文本之前就进行.Text.ToUpper。 ToUpper应该不改变长度,所以你可以简单地将SelctionStart和SelectionLength设置回原来的样子。

另外,当您将其设置为ToUpper时,我希望再次获得更改的事件。我不确定是否还需要检查ToUpper是否真的改变了任何内容,然后再次设置文本。当你分配文本并避免给你一个无限的递归循环的变化事件时,它可能足够聪明,可以为你检查。但是,您可能不希望在事件处理程序调用中更改选择,以避免未进行进一步更改的情况,只能在外部调用中将您指定回文本。所以你可以直接守护递归。

喜欢的东西:

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中的一般工作方式相同。

+0

@downvoter(我猜这篇文章并不真正起作用),你应该发表评论,解释downvote的原因,而不仅仅是匿名地解释。 ......尤其是在最彻底的答案中,最完全地解决原始问题(在接受的答案中的更简单的替代方案在打字时不会“仅显示大写字母”;这个答案解决了保留克拉/选择并立即与新的输入 - 尽管它可以进一步细化)。 – 2017-07-12 21:44:31

14

我知道这是旧的,但希望这可以帮助别人。我实现了如下的KeyPress事件。

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

这确实帮助了别人,谢谢你。 – WhySoSerious 2013-10-18 03:50:19

+2

这正是我尝试的,但它说:属性或索引'System.Windows.Forms.KeyPressEventArgs.KeyChar'不能被分配给 - 它是只读的 – 2016-01-19 03:46:44

3

在这里尝试这样的实现。

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

    } 
    private void InitializeUpperCaseTextBox() 
    { 
     txtbox.CharacterCasing = CharacterCasing.Upper; 
     //... etc. 
    } 
相关问题