2017-08-09 107 views
2

我寫一個擴展方法來獲取選項卡中的第一控制爲了在Control如下:如何在控件的Tab鍵順序中找到第一個控件?

public static void FirstControlFocus(this Control ctl) 
{ 
    ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 0).FirstOrDefault().Focus(); 
} 

的問題是有時候可能沒有與TabOrder==0沒有現有的控制(例如開發人員刪除!在設計模式下使用Taborder==0進行控制),這會導致運行時出錯。

我這段代碼解決這個問題:

public static void FirstControlFocus(this Control ctl) 
{ 
    if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 0)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 0).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 1)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 1).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 2)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 2).FirstOrDefault().Focus(); 
    else if (ctl.Controls.OfType<Control>().Any(c => c.TabIndex == 3)) 
     ctl.Controls.OfType<Control>().Where(c => c.TabIndex == 3).FirstOrDefault().Focus(); 
} 

但我認爲這不是最好的方式,任何人都可以提出一個更好的方式來處理這個問題?提前致謝。

回答

2

您可以使用Min()

public static void FirstControlFocus(this Control ctl) 
{ 
    ctl.Controls.OfType<Control>() 
     .FirstOrDefault(c => c.TabIndex == ctl.Controls.OfType<Control>().Min(t => t.TabIndex)) 
     ?.Focus(); 
} 

有一個在Where()沒有必要 - 你只能使用FirstOrDefault()。另外,如果FirstOrDefault()返回null,則考慮使用?.Focus()

+0

'FirstOrDefault()'後面的'?'是什麼? –

+1

@combo_ci,看到這裏 - https://msdn.microsoft.com/en-us/magazine/dn802602.aspx –

+0

非常感謝羅姆人,我今天學到了新東西:) –

相關問題