A.Pissicat
A.Pissicat

Reputation: 3265

Hide empty columns in DataGridView

I'm working in c# with Windows form.

I've an item DataGridView named objGridView, used like this :

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; }
}

The class dlgDetailsObj is used to display a list of Persons/Companies and probably more object later.

My DataGridView has a DataSource filled of dlgItem. Actually all three fields are displayed, even if I only only one.

How can I define my code to display columns only if binded fields are not null ?

Upvotes: 1

Views: 1126

Answers (1)

mm8
mm8

Reputation: 169150

If you want to hide all empty columns you could iterate through the DataSource collection to determine whether the corresponding property has been set for any dlgItem object:

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());
}

Upvotes: 1

Related Questions