繁体   English   中英

Textbox.SelectionStart

[英]Textbox.SelectionStart

我正在尝试将SelectionStart和SelectionLength属性用于文本框。 它没有效果,但也没有错误。 它实际上是后台工作程序ProgressChanged方法的一部分,但我在测试解决方案中单独尝试了SelectionStart和SelectionLength并且它是相同的......没有任何反应..

有任何想法吗? 谢谢!!!

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{
    // Update the GUI as the music is playing
    textBox1.SelectionStart = ((int)e.UserState);
    textBox1.SelectionLength = (1);
}

你的代码对我来说很好(我假设你的BGW已启动,你当然正在调用ReportProgress )。

我的猜测是你的代码也适合你,但也许你的TextBox没有焦点,所以你看不到所选的文本。

如果这是您的问题,请将TextBox的HideSelection属性设置为false。 这将允许TextBox的所选文本显示为选中(突出显示),即使TextBox没有焦点。

您还可以查询TextBox的SelectedText属性以获取控件的选定文本,即使它不是这样显示的。

如果您在创建对象的同一线程(GuiThread)上运行此代码,请确保。 后台工作可能不是同一个线程创建该文本框中的一个。 您可以通过在控件上调用Invoke来确保您正在使用GuiThread(您可以使用“this”来引用它)。

所以..做点什么

this.Invoke()。

您需要将它传递给委托,因此将文本框选择逻辑移动到单独的方法中,然后将该方法传递给Invoke()调用。

编辑:

您的代码可能看起来像这样:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.Invoke(new Action<TextBox, int, int>(UpdateTextboxSelection), new object[] { textBox1, (int)e.UserState, 1 });
}

private void UpdateTextboxSelection(TextBox t, int start, int length)
{
    t.SelectionStart = start;
    t.SelectionLength = length;
    t.Focus(); // to make sure the box is in focus so that you see the selection
}

编辑2:注意,我还没有真正试图看看这是否有效,这只是我一直想知道为什么某些UI事情没有做任何事情的常见问题,我注意到我在不同的线程上运行我开始使用它运行的GUI Thread。

编辑3:我刚刚进行了测试。 完成后,请确保在文本框上使用Focus()。 可能正在按照您的意图设置文本选择,但由于该框未处于焦点位置,因此您无法看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM