Question

J'ajouté datagridview à mes formes victoire app et j'ai aussi ajouté un CheckBox pour marquer les lignes. Le CheckBox fonctionne comme je m'y attendais jusqu'à ce que l'utilisateur trie les DataGridView. Une fois le tri de la sélection précédente de la colonne de cases à cocher est perdue.

Est-il possible que je peux faire mon datagridview se rappeler quelle ligne est sélectionné après le tri?

Était-ce utile?

La solution

Vous avez deux options pour résoudre ce problème.

La première et peut-être le plus simple est de lier votre colonne de cases à cocher à votre source de données. Par exemple, si vous utilisez un DataTable comme source de données, l'ajout d'une colonne booléenne va créer une case à cocher sur votre DataGridView qui sorte et ne pas perdre l'état vérifié.

Si ce n'est pas une option, puis l'autre façon d'aborder le problème est de définir votre DataGridView en mode Virtual et maintenir un cache de vos valeurs de cases à cocher.

Découvrez l'excellent DataGridView FAQ pour un exemple de la façon de procéder. J'ai également fourni le code ci-dessous mais ne consulter la 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;
    }
}

Autres conseils

Je suis surpris que cela arrive, mais s'il n'y a pas d'autre solution dans le pire des cas, vous pouvez régler le tri pour programmatique et gérer lorsque l'utilisateur clique sur l'en-tête de colonne, enregistrer une liste dont les articles sont vérifiés , faire le tri par programme et vérifier tous les éléments qui doivent être vérifiés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top