隐藏DataGridView中的空列

时间:2017-05-29 14:56:32

标签: c# forms datagridview

我在使用Windows窗体的c#中工作。

我有一个名为objGridView的项DataGridView,使用如下:

public partial class dlgDetailsObj : Form
{
    public dlgDetailsObj(myInterface item)
    {
        InitializeComponent();

        objGridView.DataSource = new BindingList<dlgItem>();
        var t = new Task(() =>
        {
            List<dlgItem> listElements = new List<dlgItem>();
            if (item is List<Person>)
            {
                List<Person> list = (List<Person>)item;
                foreach (Person person in list)
                {
                    listElements.Add(new dlgItem()
                    {
                        Name = person.Name,
                        Forname = person.Forname
                    });
                }
            }
            else if (item is List<Compagny>)
            {
                List<Compagny> list = (List<Compagny>)item;
                foreach (Compagny compagny in list)
                {
                    listElements.Add(new dlgItem()
                    {
                        Compagny = compagny.Name
                    });
                }
            }
            else
            {
                return;
            }

            foreach (dlgItem item in listElements)
            {
                objGridView.Invoke((MethodInvoker)delegate
                {
                    int sel = objGridView.GetSelectedRowIndex();
                    ((BindingList<dlgItem>)objGridView.DataSource).Add(item);
                    objGridView.SetSelectedRowIndex(sel);
                });
            }
        });
        t.Start();
    }
}

internal class dlgItem
{
    public string Name { get; set; }
    public String Forname { get; set; }
    public String Compagny { get; set; }
}

班级dlgDetailsObj用于显示人员/公司列表,以及稍后可能更多的对象。

我的DataGridView的数据源填充为dlgItem。实际上,即使我只有一个字段,也会显示所有三个字段。

如果绑定字段不为空,我如何定义代码才能显示列?

1 个答案:

答案 0 :(得分:1)

如果要隐藏所有空列,可以遍历DataSource集合以确定是否已为任何dlgItem对象设置了相应的属性:

public dlgDetailsObj(myInterface item)
{
    InitializeComponent();

    objGridView.DataSource = new BindingList<dlgItem>();
    var t = new Task(() =>
    {
        ...
    });
    t.Start();

    t.ContinueWith(task =>
    {
        bool displayNameColumn = false;
        bool displayFornameColumn = false;
        bool displayCompanyColumn = false;
        foreach (dlgItem item in (BindingList<dlgItem>)objGridView.DataSource)
        {
            if (!string.IsNullOrEmpty(item.Name))
                displayNameColumn = true;
            if (!string.IsNullOrEmpty(item.Forname))
                displayFornameColumn = true;
            if (!string.IsNullOrEmpty(item.Compagny))
                displayCompanyColumn = true;
        }
        objGridView.Columns[0].Visible = displayNameColumn;
        objGridView.Columns[1].Visible = displayFornameColumn;
        objGridView.Columns[2].Visible = displayCompanyColumn;
    }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}