Domanda

ho aggiunto alla mia datagridview forme vittoria app e ho anche aggiunto una CheckBox per la marcatura righe. Il CheckBox funziona come mi aspettavo fino a quando l'utente ordina la DataGridView. Dopo l'ordinamento precedente selezione di colonna casella è persa.

C'è un modo posso fare la mia datagridview ricordare quale riga è selezionata dopo l'ordinamento?

È stato utile?

Soluzione

Hai due opzioni per risolvere questo problema.

Il primo e forse il più semplice è quello di associare la colonna casella di controllo per la vostra origine dati. Ad esempio, se si utilizza un DataTable come origine dati, l'aggiunta di una colonna booleana creerà una casella di controllo sul vostro DataGridView che ordinare e non perdere lo stato controllato.

Se questo non è un'opzione, allora l'altro modo di affrontare il problema è quello di impostare il DataGridView in modalità Virtual e mantenere una cache dei vostri valori casella di controllo.

Scopri l'eccellente DataGridView FAQ per un esempio di come fare questo. Ho anche fornito il codice qui sotto, ma controlli anche il FAQ:

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;
    }
}

Altri suggerimenti

Sono sorpreso che ciò accade, ma se non c'è altro modo intorno ad esso in un caso peggiore che si potrebbe impostare l'ordinamento per programmatico e poi gestire quando l'utente fa clic sul titolo della colonna, salvare un elenco dei quali sono controllati articoli , fare la selezione a livello di codice e quindi controllare tutti gli elementi che devono essere controllati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top