在.NET环境下,使用TextBox控件时可能会遇到一个常见问题:当TextBox的宽度不足以显示全部文本时,文本的末尾会显示出来。如果用户调整TextBox的宽度以使其能够显示整个字符串,TextBox并不会重新定位文本以显示所有文本。为了解决这个问题,需要通过代码来重置文本的位置,同时保持任何文本选择和光标位置。
.NET的TextBox控件实际上是对旧的Win32编辑框控件的一个封装。这限制了其功能,并使得自定义变得困难。即使是调整TextBox的高度这样的简单任务,也需要使用复杂的工作方式来完成。当调整TextBox的大小,使得部分文本位于控件的左侧边缘时,它永远不会重新定位文本以显示尽可能多的内容。为了克服这个限制,需要修改TextBox的文本选择。
为了重置TextBox中的可见文本,需要改变光标(光标)位置到字符串的开头,然后再回到末尾。但是,这样做会丢失用户在调整大小之前可能已经选择的内容。这个例程将确定在控件中选择了什么,重置光标位置,然后恢复用户的原始选择。
以下是使用Visual Basic实现的代码示例:
Private Sub SetAllTextVisible(ByRef tbTextBox As TextBox)
Dim iSelectStart As Integer
Dim iSelectLength As Integer
' 获取当前选择,以便可以重新选择。
iSelectStart = tbTextBox.SelectionStart
iSelectLength = tbTextBox.SelectionLength
' 取消所有选择,并将光标设置到行的开头
tbTextBox.Select(0, 0)
tbTextBox.SelectionStart = 0
' 恢复用户的原始选择
tbTextBox.Select(iSelectStart, iSelectLength)
End Sub
以下是使用C#实现的代码示例:
public void SetAllTextVisible(TextBox tbTextBox)
{
int startselect;
int selectlength;
// 获取当前选择,以便可以重新选择
startselect = tbTextBox.SelectionStart;
selectlength = tbTextBox.SelectionLength;
// 取消所有选择,并将光标设置到行的开头
tbTextBox.Select(0, 0);
tbTextBox.SelectionStart = 0;
// 恢复用户的原始选择
tbTextBox.Select(startselect, selectlength);
}
另外,可以创建一个新的UserControl类,并在类声明中将继承从UserControl更改为TextBox。重写OnSizeChanged事件以调用SetAllTextVisible例程。