mikrocontroller.net

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


Autor: Daniel L. (grorkef)
Datum:

Bewertung
0 lesenswert
nicht 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 :(
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string table = "gebäude";

            if (radioButton1.Checked)
            {
                table = "gebäude";
            }
            else if (radioButton2.Checked)
            {
                table = "forschungen";
            }

            metall = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["metall"]));
            kristall = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["kristall"]));
            deuterium = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["deuterium"]));
            energie = Convert.ToInt64(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["energie"]));
            double factor = Convert.ToDouble(IsNull(dataset.Tables[table].Rows[comboBox1.SelectedIndex]["faktor"]));

            dt.Rows.Clear(); dt.Columns.Clear();
            dt.Columns.Add(new DataColumn("Stufe", typeof(int)));
            dt.Columns.Add(new DataColumn("Metall", typeof(string)));
            dt.Columns.Add(new DataColumn("Kristall", typeof(string)));
            dt.Columns.Add(new DataColumn("Deuterium", typeof(string)));
            dt.Columns.Add(new DataColumn("Energie", typeof(string)));

            if (metall == 0) this.dt.Columns[1].ColumnMapping = MappingType.Hidden;
            if (kristall == 0) this.dt.Columns[2].ColumnMapping = MappingType.Hidden;
            if (deuterium == 0) this.dt.Columns[3].ColumnMapping = MappingType.Hidden;
            if (energie == 0) this.dt.Columns[4].ColumnMapping = MappingType.Hidden;

            Debug.WriteLine(dt.Columns[1].ColumnMapping);
            Debug.WriteLine(dt.Columns[2].ColumnMapping);
            Debug.WriteLine(dt.Columns[3].ColumnMapping);
            Debug.WriteLine(dt.Columns[4].ColumnMapping);
            Debug.WriteLine("\r\n");
           
            for (int i = 1; i <= 50; i++)
            {
                double met = metall * Math.Pow(factor, (i - 1));
                double kris = kristall * Math.Pow(factor, (i - 1));
                double deut = deuterium * Math.Pow(factor, (i - 1));
                double ene = energie * Math.Pow(factor, (i - 1));
                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));
            }
            dataGridView1.Refresh();
        }

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.

Autor: Markus Volz (valvestino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein klein wenig googlen:

http://msdn.microsoft.com/en-us/library/aa984260%2...

Gruß
Markus

Autor: Daniel L. (grorkef)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Daniel L. (grorkef)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus,

dataGridView1.Columns[2].Width = 0;

ruft den selben Fehler hervor wie:

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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel L. (grorkef)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab ne Methode eingefügt die ausgelöst wird wenn Neue Daten im 
DataGridView sind:
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            Debug.WriteLine(dataGridView1.Columns.GetFirstColumn(DataGridViewElementStates.Visible));
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                Debug.WriteLine(dataGridView1.Columns.GetNextColumn(dataGridView1.Columns[i],DataGridViewElementStates.Visible,DataGridViewElementStates.None));
            }
            Debug.WriteLine("\r\n");

            //if (metall == 0) dataGridView1.Columns[2].Visible = false;
            //if (kristall == 0) dataGridView1.Columns[3].Visible = false;
            //if (deuterium == 0) dataGridView1.Columns[4].Visible = false;
            //if (energie == 0) dataGridView1.Columns[5].Visible = false;
        }

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:
System.ArgumentOutOfRangeException wurde nicht von Benutzercode behandelt.
  Message="Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.\r\nParametername: index"
  Source="mscorlib"
  ParamName="index"
  StackTrace:
       bei System.Collections.ArrayList.get_Item(Int32 index)
       bei System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
       bei OCalc.Form1.dataGridView1_DataBindingComplete(Object sender, DataGridViewBindingCompleteEventArgs e) in ***\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:Zeile 243.
       bei System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender, ListChangedEventArgs e)
       bei System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)
       bei System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender, ListChangedEventArgs e)
       bei System.Data.DataView.OnListChanged(ListChangedEventArgs e)
  InnerException: 

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.