2017-04-06 102 views
0

我一直在努力解決這個問題幾天了,我還沒有找到任何答案;我創建了一個ToolStripMenu陣列從一個存儲過程動態填充:使用列表內容過濾datagridview C#

ToolStripMenuItem[] itemsDepto = null; 
itemsDepto = new ToolStripMenuItem[data.Tables[0].Rows.Count]; 
for (int i = 0; i <= data.Tables[0].Rows.Count - 1; i++) 
{ 
    itemsDepto[i] = new ToolStripMenuItem(); 
    itemsDepto[i].Tag = data.Tables[0].Rows[i].ItemArray[0]; 
    itemsDepto[i].Text = data.Tables[0].Rows[i].ItemArray[1].ToString(); 
    itemsDepto[i].CheckOnClick = true; 
    itemsDepto[i].Checked = true; 
    itemsDepto[i].Click += DeptoFilter_Click; 
    deptoList.Add(data.Tables[0].Rows[i].ItemArray[1].ToString()); 
} 
tsmiDepartamento.DropDownItems.AddRange(itemsDepto); 

而且我想要實現的是使用該ToolStripMenu作爲用戶的過濾器控制,默認情況下被選中狀態,以便當用戶取消選中在菜單中,它應該過濾未被選中內容的行。

Click事件中我添加和刪除列表取決於菜單按鈕的狀態值,你可以在下面的例子中看到:

private void DeptoFilter_Click(object sender, EventArgs e) 
{ 
    ToolStripMenuItem temp = new ToolStripMenuItem(); 
    temp = (ToolStripMenuItem)sender; 
    BindingSource bind = new BindingSource(); 
    bind.DataSource = dgvPersonalTotal.DataSource; 
    if (temp.CheckState == CheckState.Checked) 
    { 
     deptoList.Add(sender.ToString()); 
    } 
    else 
    { 
     deptoList.Remove(sender.ToString()); 
    } 
    bind.Filter = "Departamento NOT IN (" + /*LIST*/"" + ")"; 
    dgvPersonalTotal.DataSource = bind; 
    //foreach (string x in deptoList) 
    //{ 
    //} 
} 

但最大的問題我有,我怎樣才能使用列表過濾綁定源,如你可以在代碼中看到的,我不能只使用列表,甚至嘗試在foreach中使用BindingSource.Filter,我不知道如何解決這個問題,所以任何想法都很受讚賞。

+0

deptoList是什麼類型的? – Alon

+0

List deptoList = new List (); – cyberac75

回答

0
bind.Filter = "Departamento NOT IN (" + string.Join(",", deptoList.ToArray()) + ")"; 
+0

這對我很好,因爲這個想法:bind.Filter =「Departamento IN(」+ string.Join(「,」,deptoList.Select(x =>「'」+ x +「'」))+ 「)」 – cyberac75

+0

我不能投票,但我會給你正確的答案,但是任何想要使用此代碼的人都需要知道這不是正確的答案,它會導致你的代碼崩潰異常:拋出的異常:System.Data.dll中的'System.Data.SyntaxErrorException',請使用上面評論中發佈的答案 – cyberac75