2017-05-29 2 views
1

Ich arbeite in C# mit Windows Form.Leere Spalten in DataGridView ausblenden

Ich habe einen Artikel DataGridView namens objGridView, so benutzte:

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

Die Klasse dlgDetailsObj verwendet wird, um eine Liste von Personen/Firmen anzuzeigen, und wahrscheinlich mehr Objekt später.

Meine DataGridView hat eine DataSource von dlgItem gefüllt. Eigentlich werden alle drei Felder angezeigt, auch wenn ich nur einen einzigen habe.

Wie kann ich meinen Code so definieren, dass Spalten nur dann angezeigt werden, wenn binded Felder nicht null sind?

Antwort

1

Wenn Sie alle leeren Spalten verstecken Sie durch die DataSource Auflistung durchlaufen könnten, um zu bestimmen, ob die entsprechende Eigenschaft für jedes dlgItem Objekt gesetzt:

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

Genau das, was ich gesucht habe! –

Verwandte Themen