こういう構造のフォームを用意する

Form
TextBox1
UserControl1
Button1
TextBox2

Form の ActiveControl プロパティに form.userControl1 をセットしてフォーカスを確認する

System.Diagnostics.Debug.WriteLine(this.userControl1.CanFocus);
// True
this.ActiveControl = this.userControl1;

System.Diagnostics.Debug.WriteLine(this.ActiveControl);
// WinFormsApp1.UserControl1
System.Diagnostics.Debug.WriteLine(this.userControl1.Focused);
// False
System.Diagnostics.Debug.WriteLine(this.userControl1.ContainsFocus);
// False
System.Diagnostics.Debug.WriteLine(this.userControl1.ActiveControl);
// null

userControl1.CanFocus が True なのでフォーカスできるはず

ActiveControl に代入後には ちゃんと中身が UserControl1 になってる
なのに userControl1 の Focused や ContainFocus は False
userControl1 の ActiveControl は null
フォーカスが行方不明
見た目上は初期位置の TextBox1 のまま

もしかして JavaScript であるようなイベントループに処理を返してから変わったり?
タイマーで 1 秒待ってから同じものを表示するようにしてみる
→全く同じ結果

ActiveControl とフォーカスは別?

だけど

this.ActiveControl = this.userControl1.button1;

にして 代入直後の時点でさっきと同じ内容を表示すると

WinFormsApp1.UserControl1
False
True
System.Windows.Forms.Button, Text: button1

ContainsFocus が True になっていて userControl1 の ActiveControl が button1 になってる
見た目上でもボタンにフォーカスがあたってる

this.ActiveControl = this.textBox2;

でもフォーカスが切り替わってカーソル位置も変わってる

UserControl だけ特殊みたい


Focus メソッドも使ってみる

this.userControl1.Focus()

WinFormsApp1.UserControl1
False
True
System.Windows.Forms.Button, Text: button1

「this.userControl1.button1」 を ActiveControl に設定したときと一緒で UserControl1 内の最初のコントロールにフォーカスがあたってる
UserControl 自体にはフォーカス当たらなそう

だけど UserControl1 の中身を空にしてから

this.userControl1.Focus()

すると

WinFormsApp1.UserControl1
True
True
(null)

フォーカスあたってるみたい
画面上ではどこにもフォーカスあたってるような見た目はなし