Frage

Ich habe ein Problem beim Beibehalten der Benutzerauswahl in einer DataGridViewComboBoxColumn in einer DataGridView in Winform.Sobald ich die ComboBox verlasse, verschwindet die Auswahl.

Ich hatte einige Antworten auf das Problem gefunden, z. B. den SelectedIndex auf -1 gesetzt, aber es hat nicht funktioniert.Bitte zeigen Sie mir die richtige Richtung.

Vielen Dank im Voraus.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // Create DataTable.
        DataColumn classIdColumn = new DataColumn("Class", typeof(string));
        _schoolTable = new DataTable("School");
        _schoolTable.Columns.AddRange(new[] { classIdColumn });
        DataRow row = _schoolTable.NewRow();
        row["Class"] = "yr 5";
        _schoolTable.Rows.Add(row);

        // Bind DataGridView to DataTable, and add ComboBoxColumn.
        dataGridView1.DataSource = _schoolTable;
        DataGridViewComboBoxColumn listCol = new DataGridViewComboBoxColumn();
        listCol.DisplayIndex = 1;
        listCol.DataSource = GetChoices();
        listCol.DisplayMember = "Category";
        listCol.ValueMember = "Number";
        listCol.DefaultCellStyle.NullValue = "None";
        dataGridView1.Columns.Add(listCol);
    }

    private DataTable _schoolTable;

    private static List<IHuman> GetChoices()
    {
        return Choices;
    }

    private static readonly List<IHuman> Choices = new List<IHuman>(){ new Student(), new Teacher() };

    private interface IHuman
    {
        int Number { get; set; }
        string Category { get; }
    }

    private class Student : IHuman
    {
        public int Number { get; set; }
        public string Category { get { return "student"; } }
    }

    private class Teacher : IHuman
    {
        public int Number { get; set; }
        public string Category { get { return "teacher"; } }
    }
}

War es hilfreich?

Lösung

Diese anfängliche Ursache des Problems besteht darin, dass Sie für Ihre IHuman-Objekte keine Werte für die Number-Eigenschaft angeben.

Wenn Sie Ihre Codezeile, in der Sie die Liste erstellen, in Folgendes ändern:

private static readonly List<IHuman> Choices = new List<IHuman>() { new Student() {Number = 0}, new Teacher() {Number = 1} };

Oder fügen Sie Standardwerte in die Number-Eigenschaft jedes Objekts ein, das IHuman implementiert, wie Sie es für die Category-Eigenschaft haben, dann sollte Ihre Combobox korrekt funktionieren.


Außerdem können Sie die Arbeit mit Ihrem Code etwas vereinfachen.

Als Erstes können Sie Ihrer Datentabelle eine Spalte hinzufügen, um die Datenbindung in Ihrer Combobox-Spalte zu unterstützen. So können Sie sich nur die Datentabelle ansehen, um zu erfahren, was ausgewählt wurde.Der Code dafür ist unten:

DataColumn classIdColumn = new DataColumn("Class", typeof(string));
_schoolTable = new DataTable("School");

//Create a new column in the data table of type int
DataColumn humanIdColumn = new DataColumn("HumanId", typeof(int));

_schoolTable.Columns.AddRange(new[] { classIdColumn });
_schoolTable.Columns.AddRange(new[] { humanIdColumn });

DataRow row = _schoolTable.NewRow();
row["Class"] = "yr 5";
_schoolTable.Rows.Add(row);

// Bind DataGridView to DataTable, and add ComboBoxColumn.
dataGridView1.DataSource = _schoolTable;
DataGridViewComboBoxColumn listCol = new DataGridViewComboBoxColumn();
listCol.DisplayIndex = 1;
listCol.DataSource = GetChoices();
listCol.DisplayMember = "Category";
listCol.ValueMember = "Number";
//Set the DataPropertyName on the comboboxcolumn to enable databinding
listCol.DataPropertyName = "HumanId";
listCol.DefaultCellStyle.NullValue = "None";
dataGridView1.Columns.Add(listCol);

//Hide the autogenerated column HumanId - we only have it for the databinding
dataGridView1.Columns["HumanId"].Visible = false;


Nach dieser Änderung würde ich dringend empfehlen, Listen mit benutzerdefinierten Objekten für Ihre Datenquelle zu verwenden, anstatt eine Datentabelle zu verwenden. Ich habe immer festgestellt, dass dies viel flexibler ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top