Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Textbox.SelectionStart_C#_Winforms_Textbox_Selection - Fatal编程技术网

C# Textbox.SelectionStart

C# Textbox.SelectionStart,c#,winforms,textbox,selection,C#,Winforms,Textbox,Selection,我正在尝试对文本框使用SelectionStart和SelectionLength属性。它没有效果,但也没有错误。它实际上是后台工作者ProgressChanged方法的一部分,但我在测试解决方案中单独尝试了SelectionStart和SelectionLength,结果是一样的。。什么事也没有发生 有什么想法吗?谢谢 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e

我正在尝试对文本框使用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);
}

确保在创建对象的同一线程(GuiThread)上运行此代码。后台工作线程可能与创建textbox的线程不同。 您可以通过调用控件上的Invoke(您可以用“this”来引用该控件)来确保使用的是GuiThread

所以。。做点像

这是Invoke()

您需要向它传递一个委托,因此将textbox选择逻辑移动到一个单独的方法中,然后将该方法传递到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
}
private void backgroundWorker1\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
Invoke(新操作(UpdateTextboxSelection),新对象[]{textBox1,(int)e.UserState,1});
}
私有void UpdateTextboxSelection(文本框t、int-start、int-length)
{
t、 选择开始=开始;
t、 SelectionLength=长度;
t、 Focus();//确保框处于焦点位置,以便看到所选内容
}
编辑2:注意,我实际上并没有试着看看这是否有效,这只是一个常见的问题,当我想知道为什么某些UI东西没有做任何事情时,我注意到我运行在一个不同的线程上,当我开始使用GUI线程时,它是有效的


编辑3:我刚刚做了一个测试。完成后,请确保将()焦点放在文本框上。文本选择可能是按照您的意愿设置的,但您看不到它,因为框未处于焦点。

您的代码对我来说运行正常(我假设您的BGW已启动,您正在调用
ReportProgress

我猜你的代码也适用于你,但也许你的文本框没有焦点,所以你看不到选中的文本

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


您还可以查询您的文本框以获取控件的选定文本,即使它没有显示出来。

我用wpf尝试过它,它也是一样的。。编译和运行没有错误但没有效果我只是用这个做了一个简单的测试。textBox1.SelectionStart=3;而this.textBox1.SelectionLength=1;在我的状态下,它工作得很好。你到底希望看到什么对你不起作用?灰熊,你能看看Edit3来回答我的问题吗?您可能需要在框上调用Focus(),如果选择不在焦点中,则该选择可能不会显示。对于HideSelection,您的意思是说False吗?是的,这个HideSelection=False实际上工作得稍微好一点,当我使用焦点时,单击“取消”按钮时会出现一些延迟。我不认为这是问题。。例如,如果我把这个。。。label6.Text=e.UserState.ToString();在我的progresschanged方法中,更改相同形式的标签文本没有问题。也谢谢@grizzly_beer我认为Jay的解决方案很到位,这是一个比我在这里所说的明确呼叫Focus更好的方法。是的,我刚刚尝试过,我同意,再次感谢!用焦点点击取消按钮时出现了一些延迟