2015-04-01 46 views
0

我正在重構一些代碼來練習LINQ。出於某種原因,我無法獲得此代碼進行合作。使用LINQ設置控件的可見性

 //ActionControls is a ControlCollection 
var actionControls = flowLayoutPanel1.FilterControls(c => c is Button); 

    //TODO: Optimize 
    foreach(var control in actionControls) 
    { 
     control.Visible = workingItemDataTable.AsEnumerable().Any(row => "btn" + row.Field<string>("Name") == control.Name); 
    } 

什麼我想現在要做的。

flowLayoutPanel1.FilterControls(c => c is Button && c.Name == "btnTaskInfo"//btnTaskInfo is always visible 
        || workingItemDataTable.AsEnumerable().Any(row => "btn" + row.Field<string>("Name") == c.Name)).Cast<Button>() 

但作爲一個按鈕鑄造後,我想不出如何設置visible = false。任何建議?

+0

LINQ只是語法糖,你必須反覆控件集合 – 2015-04-01 16:38:02

+0

我希望某種select語句或者一個組或什麼的。但多數民衆贊成我以爲我只是不知道 – DidIReallyWriteThat 2015-04-01 16:57:08

回答

0

你還是會需要遍歷的控制,但你也許可以做到這一點,假設FilterControls是不是比當一個別名得多:

var actionControls = flowLayoutPanel1.OfType<Button>(); 

有一些「招數」和快捷鍵在lambda表達式中迭代和執行集合,但它使代碼看起來很亂,而且它們大多隻是黑客。你可以創建你自己的擴展ForEach(如果你真的想要這樣做的話,你可以創建自己的擴展ForEach)。

flowLayoutPanel1.OfType<Button>().ForEach(btn=>{btn.Visible= ... }); 
+0

多數民衆贊成在我的想法。是的過濾器控件做的更多一點,它從頂級LVL父母一直沿着子行過濾 – DidIReallyWriteThat 2015-04-01 20:30:28

相關問題