C#Winforms-防止以编程方式添加控件时窃取焦点

C#Winforms-防止以编程方式添加控件时窃取焦点,c#,winforms,user-controls,controls,focus,C#,Winforms,User Controls,Controls,Focus,我有个奇怪的问题。 我的情况如下: 我有一个表单,它包含几个用户控件,这些控件依次包含其他用户控件或其他基本控件,如TextBox、RichTextBox等 编辑文本框时,作为逻辑的一部分,我以编程方式创建另一个控件,并将其告知表单。表单上的其他控件可能会依次作出反应并创建更多控件 问题是,这些控件在创建并添加到表单/其他控件时会从我的控件中窃取焦点 有没有办法防止我的控件在这种情况下失去焦点?也许您应该首先在逻辑中包含选项卡索引,当您添加控件时,将选项卡索引设置为最后一个选项卡索引+1,如果您

我有个奇怪的问题。 我的情况如下:

我有一个表单,它包含几个用户控件,这些控件依次包含其他用户控件或其他基本控件,如TextBox、RichTextBox等

编辑文本框时,作为逻辑的一部分,我以编程方式创建另一个控件,并将其告知表单。表单上的其他控件可能会依次作出反应并创建更多控件

问题是,这些控件在创建并添加到表单/其他控件时会从我的控件中窃取焦点


有没有办法防止我的控件在这种情况下失去焦点?

也许您应该首先在逻辑中包含选项卡索引,当您添加控件时,将选项卡索引设置为最后一个选项卡索引+1,如果您先在控件上设置选项卡顺序,您的工作会更轻松,并将常数设置为设计时的最后一个选项卡索引,请参见此处:

private const int LAST_TAB_INDEX = 5; // an Example private int lastTabIndex = LAST_TAB_INDEX; private void AddControl(){ // Set up your control Control ctl = new Control(); // .... ctl.TabIndex = lastTabIndex; this.Add(ctl); this.lastTabIndex++; } private const int LAST_TAB_INDEX=5;//一个例子 private int lastTabIndex=最后一个选项卡索引; 私有void AddControl(){ //设置你的控制 控制ctl=新控制(); // .... ctl.TabIndex=lastTabIndex; 添加(ctl); 这个.lastTabIndex++; } 您可以从示例中看到选项卡索引是如何递增的,这样可以防止 控制从窃取焦点

希望这有帮助, 顺致敬意,
Tom.

控件不能接受(窃取)焦点,除非它们可见并启用。您是否尝试过创建控件,其中一个或两个控件都为false,然后在适当的时候将其打开?

传递一个引用具有焦点的控件的句柄,并使其成为新实例化的控件利用该句柄将焦点传递回上一个控件?这对于最终用户来说似乎太明显了,由于新实例化的控件可能是一个滚动页面,因此使用起来似乎有点“神经质”。考虑到这一点,甚至还反映了.NET组件,以查看CanFocus/Focus检查的内容(即使MSDN说明了什么),但这似乎并不是在所有情况下都有帮助,而且有时我还是需要使控件可见。无论如何,我会把这个标记为答案,因为这可能是最接近的答案。我的情况似乎更为微妙,我会处理好这件事,然后再看。谢谢。@RanSagy你找到解决问题的方法了吗?