7
votes

DataGridView Cellule d'en-tête de rangée d'affichage

J'essaie d'afficher une simple datagridview liée à un jeu de données et je souhaite, finalement, ma première colonne de la clé de données pour être la cellule d'en-tête de ligne pour la DataGridView. À ce stade, je me contenterai d'avoir une valeur dans la cellule d'en-tête de rangée. Je peux afficher la DataGridView avec toutes mes lignes et colonnes, et avec des cellules d'en-tête de colonne, mais aucune cellule d'en-tête de rangée. Je vérifie la valeur dans la ligne.HeaderCell.value et les données que j'ai installées y a-t-il. Je vérifie rangée.adiscell.displayed et c'est faux, mais c'est en lecture seule, donc je ne peux donc pas le rendre vrai. Comment faire l'affichage de la cellule en-tête de la rangée?

Voici un échantillon simple de ce que j'ai essayé d'obtenir cela pour travailler: P>

        DataTable table = new DataTable();
        for (int i = 0; i<10; i++)
        {
            table.Columns.Add(new DataColumn("column-" + i));
        }

        for (int i = 0; i < 10; i++)
        {
            DataRow theRow = table.NewRow();

            for (int j = 0; j < 10; j++)
                theRow[j] = i + "-" + j;
            table.Rows.Add(theRow);

        }

        dataGridView1.DataSource = table;
        dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
        int rowNumber = 1;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;
            row.HeaderCell.Value = "Row " + rowNumber;
            rowNumber = rowNumber + 1;
        }
        dataGridView1.AutoResizeRowHeadersWidth(
            DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);


0 commentaires

6 Réponses :


2
votes

1 commentaires

Cela transforme la cellule d'en-tête sur et éteint dans son intégralité, mon problème était que la valeur que j'ai placée dans la cellule ne s'affichait pas à l'écran. Compris en dessous.



1
votes

La réponse semble gérer l'événement DataGridView.Cellatting. Pourquoi définir la valeur ailleurs ne fonctionne pas ne me dépasse pas, mais je suis sûr qu'il y a une raison. J'ai ajouté le gestionnaire d'événements suivant et tout est bon: xxx


3 commentaires

Je crois que c'est une sorte de bug. Dans vb.net, vous pouvez définir tête-tête.value au besoin. Pourtant, vous devez recourir à votre travail en C #.


En effet, le code est exécuté à partir du constructeur. Déplacez le code pour charger un événement ou un autre gestionnaire d'événements.


Ceci est appelé à chaque colonne, c'est donc un peu gaspillé. Vous voudrez peut-être le changer pour que cela vérifie E.Columnindex == 0 avant de définir la tête de tête.Value.



9
votes

Si vous placez ce code dans le constructeur, cela ne fonctionnera pas. Déplacez le code dans l'événement Charger du formulaire et cela devrait fonctionner correctement. Un problème courant avec Windows.Forms et C # est l'utilisation d'une initialisation inappropriée dans le constructeur. De nombreux contrôles ne sont pas entièrement créés avant la fin du constructeur. (J'oublie pourquoi, mais je crois que c'est parce que la poignée n'est pas encore créée.) De nombreux "circonstances de travail" peuvent être évités, si vous initialisez dans l'événement comme recommandé par Microsoft.


0 commentaires

1
votes

Après avoir attribué des valeurs à la DataGridView, soit par liaison ou manuellement, j'ai procédé à ce qui suit: xxx

et cela a fonctionné pour moi. Je pense qu'il devrait y avoir une solution de contournement encore plus simple à Linq.


0 commentaires

5
votes

Appelez simplement ToString () comme indiqué ci-dessous

 row.HeaderCell.Value = ("Row " + rowNumber).ToString();


2 commentaires

@Andro SELVA: Si cette logique est liée à CTOR, je ne peux pas voir la valeur de tête de tête lorsque le formulaire est rendu. Si j'appelle cette méthode dans form_load (), cela fonctionne. :)


Heh, après avoir essayé tout le reste, j'ai essayé cela et cela a fonctionné. Merci pour l'info!



1
votes

J'ai utilisé la réponse de Karl, mais j'ai changé le gestionnaire d'événements sur Rowsadded, en supposant que le nom de l'en-tête de ligne ne change pas une fois la ligne créée. Le problème avec CellFormatting est qu'il est appelé à chaque colonne, il gaspine donc un peu de temps, régler la tête de tête et encore.

    private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        DataGridView gridView = sender as DataGridView;
        MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ;
        if (vr != null)
        {
            gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString();
        }
    }


0 commentaires