none
DataGridViewCell Typ ändern RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein DataGridView, das angebunden ist. In einer der Spalten stehen dann Werte, wie z.B. "B" oder "S". Wenn in einer Spalte einer Row der Wert "B" steht, soll sich eine Zelle in eine DataGridViewCheckBoxCell ändern.

    Ich habe das im CellFormatting-Event probiert und versucht, der Zelle eine neue DataGridViewCheckBoxCell zuzuweisen, aber dann schmiert die Anwendung ab.

    Frage daher, wie kann ich zur Laufzeit den Typ einer Zelle ändern? Die Zellen der Spalte können gemischt sein, also eine Zelle könnte eine DataGridViewTextBoxCell, die andere eine DataGridViewCheckBoxCell sein.

    Mittwoch, 5. Oktober 2011 09:59

Antworten

  • Hallo SPDeveloperXP,

    Das mit dem CellFormatting-Ereignis kann ich nachvollziehen, da dabei u.U. ein Wiedereintrittsfehler bei SetCurrentCellAddressCore() auftreten kann. Hier eine relativ einfache Lösung bei der DataGridViewCheckBoxCell-Controls dynamisch erstellt werden:

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1() {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e) {
                LoadData();
                FormatFirstColumn();
            }
    
            private void LoadData() {
                DataTable table = new DataTable();
                table.Columns.Add("Bestellt");
                table.Columns.Add("Produkt");
                table.Rows.Add(new object[] { "T", "Produkt 1" });
                table.Rows.Add(new object[] { "F", "Produkt 2" });
                table.Rows.Add(new object[] { "WIRD NICHT MEHR HERGESTELLT", "Produkt 3" });
                this.dataGridView1.DataSource = table;
            }
    
            private void FormatFirstColumn() {
                for (int i = 0; i < dataGridView1.Rows.Count; i++) {
                    DataGridViewRow currentRow = (DataGridViewRow)dataGridView1.Rows[i];
                    DataGridViewCell currentCell = (DataGridViewCell)currentRow.Cells[0];
                    string cellValue = (string)currentCell.Value;
    
                    if ((cellValue == "T" || cellValue == "F")) {
                        DataGridViewCheckBoxCell checkBoxCell = new DataGridViewCheckBoxCell { 
                            TrueValue = "T", FalseValue = "F" 
                        };
    
                        checkBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                        dataGridView1[0, currentCell.RowIndex] = checkBoxCell;
                    }
                }
            }
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 5. Oktober 2011 12:53
    Mittwoch, 5. Oktober 2011 11:49
    Moderator

Alle Antworten

  • Hallo SPDeveloperXP,

    Das mit dem CellFormatting-Ereignis kann ich nachvollziehen, da dabei u.U. ein Wiedereintrittsfehler bei SetCurrentCellAddressCore() auftreten kann. Hier eine relativ einfache Lösung bei der DataGridViewCheckBoxCell-Controls dynamisch erstellt werden:

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1() {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e) {
                LoadData();
                FormatFirstColumn();
            }
    
            private void LoadData() {
                DataTable table = new DataTable();
                table.Columns.Add("Bestellt");
                table.Columns.Add("Produkt");
                table.Rows.Add(new object[] { "T", "Produkt 1" });
                table.Rows.Add(new object[] { "F", "Produkt 2" });
                table.Rows.Add(new object[] { "WIRD NICHT MEHR HERGESTELLT", "Produkt 3" });
                this.dataGridView1.DataSource = table;
            }
    
            private void FormatFirstColumn() {
                for (int i = 0; i < dataGridView1.Rows.Count; i++) {
                    DataGridViewRow currentRow = (DataGridViewRow)dataGridView1.Rows[i];
                    DataGridViewCell currentCell = (DataGridViewCell)currentRow.Cells[0];
                    string cellValue = (string)currentCell.Value;
    
                    if ((cellValue == "T" || cellValue == "F")) {
                        DataGridViewCheckBoxCell checkBoxCell = new DataGridViewCheckBoxCell { 
                            TrueValue = "T", FalseValue = "F" 
                        };
    
                        checkBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
                        dataGridView1[0, currentCell.RowIndex] = checkBoxCell;
                    }
                }
            }
        }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert SPDeveloperXP Mittwoch, 5. Oktober 2011 12:53
    Mittwoch, 5. Oktober 2011 11:49
    Moderator
  • Hallo Marcel,

    danke Dir für den Hinweis! Da wird das wahrscheinlich auch nie funktionieren können mit dem CellFormatting, da es wohl schon zu spät ist.

    In dem man dann aber die einzelnen Zeilen und deren Zellen betrachtet, wie in Deinem Lösungsansatz, geht es wunderbar!

     

    Vielen Dank für den Hinweis!

    (PS: Manchmal wieder sind diese GUI-Anpassungen vor allem mit DataBinding nicht ganz trivial :-D )

    Mittwoch, 5. Oktober 2011 12:56