Forum: PC-Programmierung Spalten eins DataGridView ausblenden - C#


von Daniel L. (grorkef)


Lesenswert?

Hallo,

ich möchte leere Spalten in einem DataGridView ausblenden, nun ist es so 
das er die Leeren Spalten versteckt. Aber nur bei dem Datensatz der beim 
Start des Programms geladen wurde :( Sobald ich ein anderen Datensatz 
auswähle blendet er die leeren Spalten wieder ein :(

Sobald in der ComboBox1 ein neuer Wert ausgewählt wird, wird diese 
Methode aktviert. Beim Programmstart werden die Namen aus der Datenbank 
in die ComboBox1 geladen, was die Methode einmal auslöst und dabei 
werden die leeren Spalten korrekt ausgeblendet. Sobald man jedoch 
anderen Namen funktioniert das ausblenden nicht mehr obwohl die IF 
Abfragen die richtigen Spalten auf Hidden setzen :(
1
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
2
        {
3
            string table = "gebäude";
4
5
            if (radioButton1.Checked)
6
            {
7
                table = "gebäude";
8
            }
9
            else if (radioButton2.Checked)
10
            {
11
                table = "forschungen";
12
            }
13
14
            metall = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["metall"]));
15
            kristall = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["kristall"]));
16
            deuterium = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["deuterium"]));
17
            energie = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["energie"]));
18
            double factor = Convert.ToDouble(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["faktor"]));
19
20
            dt.Rows.Clear(); dt.Columns.Clear();
21
            dt.Columns.Add(new DataColumn("Stufe", typeof(int)));
22
            dt.Columns.Add(new DataColumn("Metall", typeof(string)));
23
            dt.Columns.Add(new DataColumn("Kristall", typeof(string)));
24
            dt.Columns.Add(new DataColumn("Deuterium", typeof(string)));
25
            dt.Columns.Add(new DataColumn("Energie", typeof(string)));
26
27
            if (metall == 0) this.dt.Columns[1].ColumnMapping = MappingType.Hidden;
28
            if (kristall == 0) this.dt.Columns[2].ColumnMapping = MappingType.Hidden;
29
            if (deuterium == 0) this.dt.Columns[3].ColumnMapping = MappingType.Hidden;
30
            if (energie == 0) this.dt.Columns[4].ColumnMapping = MappingType.Hidden;
31
32
            Debug.WriteLine(dt.Columns[1].ColumnMapping);
33
            Debug.WriteLine(dt.Columns[2].ColumnMapping);
34
            Debug.WriteLine(dt.Columns[3].ColumnMapping);
35
            Debug.WriteLine(dt.Columns[4].ColumnMapping);
36
            Debug.WriteLine("\r\n");
37
           
38
            for (int i = 1; i <= 50; i++)
39
            {
40
                double met = metall * Math.Pow(factor, (i - 1));
41
                double kris = kristall * Math.Pow(factor, (i - 1));
42
                double deut = deuterium * Math.Pow(factor, (i - 1));
43
                double ene = energie * Math.Pow(factor, (i - 1));
44
                AddNewRow(dt, i, String.Format(ci, "{0:0,0}", met), String.Format(ci, "{0:0,0}", kris), String.Format(ci, "{0:0,0}", deut), String.Format(ci, "{0:0,0}", ene));
45
            }
46
            dataGridView1.Refresh();
47
        }

Leider findet man hier zu nicht wirklich viel oder ich suche einfach 
nach dem Falschen :/ die MSDN war auch keine große Hilfe die Beispiele 
dort funktionieren leider auch nicht :(

Ich hoffe ihr habt eine Idee wie ich das Problem lösen kann :)

MFG Daniel L.

von Markus V. (valvestino)


Lesenswert?


von Daniel L. (grorkef)


Lesenswert?

Da geht es um ein DataGrid im DataGridView gibts TableStyles nicht 
zumindest stehts nicht in der Intellisense.

von Markus (Gast)


Lesenswert?

Probiere es doch mal mit
1
dataGridView1.Columns[0].Width = 0;
Gruß
Markus

von Daniel L. (grorkef)


Lesenswert?

Hallo Markus,

dataGridView1.Columns[2].Width = 0;

ruft den selben Fehler hervor wie:

datagridView1.Columns[2].Visible = false;
1
System.ArgumentOutOfRangeException wurde nicht von Benutzercode behandelt.
2
  Message="Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.\r\nParametername: index"
3
  Source="mscorlib"
4
  ParamName="index"
5
  StackTrace:
6
       bei System.Collections.ArrayList.get_Item(Int32 index)
7
       bei System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
8
       bei OCalc.Form1.comboBox1_SelectedIndexChanged(Object sender, EventArgs e) in ***\WindowsFormsApplication1\Form1.cs:Zeile 202.
9
       bei System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)
10
       bei System.Windows.Forms.ComboBox.set_SelectedIndex(Int32 value)
11
       bei System.Windows.Forms.ComboBox.RefreshItems()
12
       bei System.Windows.Forms.ListControl.SetDataConnection(Object newDataSource, BindingMemberInfo newDisplayMember, Boolean force)
13
       bei System.Windows.Forms.ListControl.set_DataSource(Object value)
14
  InnerException:

von Markus (Gast)


Lesenswert?

Hi Daniel,
das heißt in diesem Fall, daß Du versuchst, auf eine nicht existierendes 
Spalten-Objekt zuzugreifen. Hast Du schon mal im Debugger geschaut, wie 
die Elemente von datagridView1.Columns aussehen?

Gruß
Markus

von Daniel L. (grorkef)


Lesenswert?

Ich hab ne Methode eingefügt die ausgelöst wird wenn Neue Daten im 
DataGridView sind:
1
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
2
        {
3
            Debug.WriteLine(dataGridView1.Columns.GetFirstColumn(DataGridViewElementStates.Visible));
4
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
5
            {
6
                Debug.WriteLine(dataGridView1.Columns.GetNextColumn(dataGridView1.Columns[i],DataGridViewElementStates.Visible,DataGridViewElementStates.None));
7
            }
8
            Debug.WriteLine("\r\n");
9
10
            //if (metall == 0) dataGridView1.Columns[2].Visible = false;
11
            //if (kristall == 0) dataGridView1.Columns[3].Visible = false;
12
            //if (deuterium == 0) dataGridView1.Columns[4].Visible = false;
13
            //if (energie == 0) dataGridView1.Columns[5].Visible = false;
14
        }

DataGridViewTextBoxColumn { Name=Stufe, Index=0 }
DataGridViewTextBoxColumn { Name=Bauzeit, Index=1 }
DataGridViewTextBoxColumn { Name=Metall, Index=2 }
DataGridViewTextBoxColumn { Name=Kristall, Index=3 }
DataGridViewTextBoxColumn { Name=Deuterium, Index=4 }
DataGridViewTextBoxColumn { Name=Energie, Index=5 }


Wenn ich nun das auskommentiere mit reinnehme wird beim ausführen des 
Programm beim ersten mal einfügen der Daten die richtigen Spalten 
ausgeblendet und wenn ich dann die Daten wechsel bekomm ich die 
Fehlermeldung:
1
System.ArgumentOutOfRangeException wurde nicht von Benutzercode behandelt.
2
  Message="Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.\r\nParametername: index"
3
  Source="mscorlib"
4
  ParamName="index"
5
  StackTrace:
6
       bei System.Collections.ArrayList.get_Item(Int32 index)
7
       bei System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
8
       bei OCalc.Form1.dataGridView1_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e) in ***\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:Zeile 243.
9
       bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender, ListChangedEventArgs e)
10
       bei System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)
11
       bei System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e)
12
       bei System.Data.DataView.OnListChanged(ListChangedEventArgs e)
13
  InnerException:

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.