CheckBox dans un DataGrid (Windows Form)

Signaler
Messages postés
3
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
29 avril 2005
-
Messages postés
3
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
16 juin 2006
-
Bonjour,



Je cherche un moyen de pouvoir insérer une colonne CheckBox sans mapping dans un DataGrid.

J'aimerais que ce checkbox réponde à quelques conditions :

- qu'il soit initialisé (non grisé) à false

- qu'il garde sa valeur quand il est checké



En effet, j'ai réussi à insérer une colonne checkbox mais celui ci ne
s'initialise pas bien que je lui donne une valeur dans le dataset et en
plus il ne garde pas sa valeur lorsque je change ma sélection.



Voici mon code :



OleDbDataAdapter MonDa = new OleDbDataAdapter(CommandText,ConnectionString);

DataSet toto = new DataSet();

MonDa.Fill(toto);



DataColumn dataColumn = new DataColumn(); // C'est cette colonne que je rajoute en plus

dataColumn.ColumnName = "Discontinued"; // des autres

toto.Tables[0].Columns.Add(dataColumn);



foreach (DataRow dataRow in toto.Tables[0].Rows)

{

dataRow["Discontinued"] =
false; // C'est ici que j'essaye d'initialiser la case à cocher




// Mais ca
ne marche pas

}



dataGrid1.DataSource = toto;



// Dans mon DataGridTableStyle j'ai bien fait gaffe de faire un DataGridBoolColumn





Merci d'avance pour votre aide



P.S : Il s'agit ici de code pour Windows Applications (Forms) et non
ASP.NET , donc s'il vous plait ne me donner pas des liens pour ce
dernier

4 réponses

Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut Verdic,

Pour ton problème, il te suffit de dériver de la classe DataGridBoolColumn, comme celà :

public
class
DataGridBoolColumnStyle : DataGridBoolColumn
{
/// <summary>Constructeur
</summary>
public DataGridBoolColumnStyle() : base
()
{
// On interdit les valeurs nulles par défaut
base.AllowNull = false
;
}

// On surcharge la méthode Paint
protected override void Paint( Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool
alignToRight )
{
// La valeur de la cellule est à null
if
( GetColumnValueAtRow( source, rowNum ) == System.DBNull.Value )
{
// Affecte la valeur par défaut, ici FALSE
SetColumnValueAtRow( source, rowNum, false
);
}

// On rappel la méthode de base
base.Paint( g, bounds, source, rowNum, backBrush, foreBrush, alignToRight );
}
}

et d'utiliser ce style pour ta colonne !!
Ca devrai suffir, mais tiens-moi au courant
Messages postés
3
Date d'inscription
vendredi 14 janvier 2005
Statut
Membre
Dernière intervention
29 avril 2005

Merci d'avoir répondu aussi vite !



Cependant, il me lève une erreur lorsqu'il y a plus d'une ligne en me
disant que la position du ListManager doit etre égale à rowNum.
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut,

J'ai essayer de reproduire ton erreur, mais rien à faire...
Tu fais quelquechose de spécial sur ton DataGrid ?
Messages postés
3
Date d'inscription
jeudi 27 janvier 2005
Statut
Membre
Dernière intervention
16 juin 2006

je suis en VB.net et j'ai eu le meme message d'erreur, j'ai donc mis la propriété position à la valeur rowNumbre avant de faire le set
ce qui donne le code suivant :

          protected overrides sub Paint( g as Graphics, bounds as Rectangle, [Source] as CurrencyManager, rowNum as Integer,  backBrush as Brush,  foreBrush as Brush,  alignToRight as Boolean )
  
              ' La valeur de la cellule est à null
              if  GetColumnValueAtRow( source, rowNum ) is System.DBNull.Value  then
            
                 ' Affecte la valeur par défaut, ici FALSE
                 source.Position = rowNum
                 SetColumnValueAtRow( [Source], rowNum, System.DBNull.Value )
              end if
       
              ' On rappel la méthode de base
              Mybase.Paint( g, bounds, [Source], rowNum, backBrush, foreBrush, alignToRight )
           end sub

Par contre, au lieu de metre false comme valeur, j'ai du mettre DBNull.value. même si cela semble paradoxale, car apparement cela ne changerai rien. Mais nous avons bien l'effet désiré, c'est à dire par defaut ne pas avoir la coche grisée et cochée.
Remarque : mon dataGridBoolColumn accepte les valeurs Nulles.