Frage

Ich habe datagridview zu meinem Sieg Formen App und ich eine CheckBox auch Reihen für die Markierung hinzugefügt. Die CheckBox arbeitet wie ich erwartet hatte, bis der Benutzer die DataGridView sortiert. Nach der Sortierung wird die vorherige Auswahl der Checkbox Spalte verloren.

Gibt es eine Möglichkeit, ich meinen datagridview erinnern machen kann, welche Zeile ausgewählt wird nach der Sortierung?

War es hilfreich?

Lösung

Sie haben zwei Möglichkeiten, dieses Problem zu lösen.

Die erste und vielleicht die einfachste ist Ihre Checkbox Spalte Ihrer Datenquelle zu binden. Zum Beispiel, wenn Sie eine Datentabelle als Datenquelle verwenden, eine boolean Spalte hinzufügen werden eine Checkbox auf Ihrem Datagridview erstellen, die Art wird und nicht den Überprüfungsstatus verlieren.

Ist dies nicht eine Option, dann die andere Art und Weise das Problem der Adressierung Ihre Datagridview Virtual-Modus einzustellen und einen Cache Ihres Checkbox Werte beibehalten.

Überprüfen Sie die ausgezeichnete out Datagridview FAQ für ein Beispiel dafür, wie dies zu tun. Ich habe auch den Code zur Verfügung gestellt aber die häufig gestellten Fragen finden Sie unter:

private System.Collections.Generic.Dictionary<int, bool> checkState;
private void Form1_Load(object sender, EventArgs e)
{
    dataGridView1.AutoGenerateColumns = false;
    dataGridView1.DataSource = customerOrdersBindingSource;

    // The check box column will be virtual.
    dataGridView1.VirtualMode = true;
    dataGridView1.Columns.Insert(0, new DataGridViewCheckBoxColumn());

    // Initialize the dictionary that contains the boolean check state.
    checkState = new Dictionary<int, bool>();
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // Update the status bar when the cell value changes.
    if (e.ColumnIndex == 0 && e.RowIndex != -1)
    {
        // Get the orderID from the OrderID column.
        int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value;
        checkState[orderID] = (bool)dataGridView1.Rows[e.RowIndex].Cells[0].Value;
    }    
}

private void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    // Handle the notification that the value for a cell in the virtual column
    // is needed. Get the value from the dictionary if the key exists.

    if (e.ColumnIndex == 0)
    {
        int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value;
        if (checkState.ContainsKey(orderID))
            e.Value = checkState[orderID];
        else
            e.Value = false;
    }

}

private void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
{
    // Handle the notification that the value for a cell in the virtual column
    // needs to be pushed back to the dictionary.

    if (e.ColumnIndex == 0)
    {
        // Get the orderID from the OrderID column.
        int orderID = (int)dataGridView1.Rows[e.RowIndex].Cells["OrderID"].Value;

        // Add or update the checked value to the dictionary depending on if the 
        // key (orderID) already exists.
        if (!checkState.ContainsKey(orderID))
        {
            checkState.Add(orderID, (bool)e.Value);
        }
        else
            checkState[orderID] = (bool)e.Value;
    }
}

Andere Tipps

Ich bin überrascht, dass das passiert, aber wenn es im schlimmsten Fall um es keine andere Möglichkeit gibt, könnten Sie die Sortierung auf programmatische gesetzt und dann behandeln, wenn der Benutzer klickt auf den Spaltenkopf, speichern eine Liste, welche Elemente geprüft , programmatisch die Sortier tun und dann alle Elemente überprüfen, die überprüft werden sollen.

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