如何在win表单中隐藏组合框中的特定项目

时间:2017-08-18 14:09:59

标签: c# winforms

如何隐藏组合框中的特定项目数。下面的代码将隐藏所有项目。我无法找到执行此操作的方法

string taskSelection = taskSelectionComboBox.Text;
string stateOfChild = stateOfChildComboBox.Text;
if (stateOfChild == "Awake")
{
    taskSelectionComboBox.Hide();
}

4 个答案:

答案 0 :(得分:4)

我建议您查看DrawItemMeasureItem事件,然后在其中制作逻辑。

// this is crucial as it gives the the measurement and drawing capabilities
// to the item itself instead of a parent ( ComboBox )
taskSelectionComboBox.DrawMode = DrawMode.OwnerDrawVariable;

taskSelectionComboBox.DrawItem +=TaskSelectionDrawItem;
taskSelectionComboBox.MeasureItem += TaskSelectionMeasureItem;

然后在TaskSelectionMeasureItem方法内部将高度设置为0

void TaskSelectionMeasureItem(object sender, MeasureItemEventArgs e)
{
    if(/* check if you want to draw item positioned on index e.Index */
        !CanDraw(e.Index) // or whatever else to determine
    )
        e.ItemHeight = 0;
}

之后在绘图方法(TaskSelectionDrawItem)中,您可以再次检查并绘制或不绘制该特定元素:

void TaskSelectionDrawItem(object sender, DrawItemEventArgs e)
{
    if(CanDraw(e.Index))
    {
        Brush foregroundBrush = Brushes.Black;
        e.DrawBackground();
        e.Graphics.DrawString(
            taskSelectionComboBox.Items[e.Index].ToString(),
            e.Font,
            foregroundBrush,
            e.Bounds,
            StringFormat.GenericDefault
        );
        e.DrawFocusRectangle();
    }
}

答案 1 :(得分:3)

另一种方法是使用DataSource组合框

var originalTasks = new List<string>
{
    "One",
    "Two",
    "Three",
    "Awake"
};

taskSelectionComboBox.DataSource = originalTasks;

然后,您将通过仅为DataSource重新分配您想要展示的项目来隐藏项目

taskSelectionComboBox.DataSource = originalTasks.Where(item => item != "Awake").ToList();

再次显示所有项目

taskSelectionComboBox.DataSource = originalTasks;

此方法适用于任何类型的项目。

答案 2 :(得分:2)

您需要存储所需的项目,然后使用remove方法删除它们。你可以使用add来恢复它们。

// keep the items in a list
List<string> list = new List<string>();
list.Add("Awake");
// remove them from combobox
comboBox1.Items.Remove("Awake");
// if you want to add them again.
comboBox1.Items.Add(list[0]);

答案 3 :(得分:1)

基于我同事 Mateusz 非常简洁的方法: 在comboBox 中显示的项目不需要是文本字符串,而是具有作为项目输出的ToString() 方法的任何对象。 我们可以在这样的对象中引入一个额外的 Hidden 属性。然后,在所描述的方法中,添加对该属性的识别,并很自然地消除该项目的显示。

替换

if (CanDraw(e.Index))
{
}

object item = combo.Items[e.Index];
var h = item.GetType().GetProperty("Hidden");
if (!(h == null) && h.GetValue(item).AsBool())
{

}