Probléme d'affichage dans un datagrid lorsque une collonne ayant le style DataGr [Résolu]

Signaler
Messages postés
2
Date d'inscription
mardi 19 juillet 2005
Statut
Membre
Dernière intervention
20 juillet 2005
-
Messages postés
2
Date d'inscription
mardi 19 juillet 2005
Statut
Membre
Dernière intervention
20 juillet 2005
-
Bonjour,



J'ai actuellment un datagrid dont la datasource peux changer, avec une
seule colonne ayant comme style 'DataGridTextBoxColumn' en lecture
seule (nameColumnStyle.ReadOnly = true;).

Quand une case est séléctionnée et que le datasource est changé la case
sélectionée reste à l'écran alors que le reste c'est éffacé.



Voic le code qui amène cette erreur, il suffit de séléctioner une case
du datagid et de cliquer sur le bouton pour voir le bug. Ce bug est
reproductible si un autre datasource est mis pas seulement quand il est
mit a null comme ici.



voici un code complet il suffit de le copier dans un fichier pour qu'il fonctionne.



using System;

using System.Data;

using System.Windows.Forms;

using System.Drawing;



public class MyForm : Form

{

private DataTable namesDataTable;

private DataGrid grid = new DataGrid();

private Button button = new Button();

private DataSet namesDataSet = new DataSet();



public MyForm() : base()

{

InitForm();



namesDataTable = new DataTable("NamesTable");

namesDataTable.Columns.Add(new DataColumn("Name"));

DataColumn dateColumn = new DataColumn

("Date", typeof(DateTime));

dateColumn.DefaultValue = DateTime.Today;

namesDataTable.Columns.Add(dateColumn);

namesDataSet.Tables.Add(namesDataTable);

grid.DataSource = namesDataSet;

grid.DataMember = "NamesTable";

AddGridStyle();

AddData();

}



private void AddGridStyle()

{

DataGridTableStyle myGridStyle = new DataGridTableStyle();

myGridStyle.MappingName = "NamesTable";



DataGridTextBoxColumn nameColumnStyle =

new DataGridTextBoxColumn();

nameColumnStyle.MappingName = "Name";

nameColumnStyle.HeaderText = "Name";

nameColumnStyle.ReadOnly = true;

myGridStyle.GridColumnStyles.Add(nameColumnStyle);



grid.TableStyles.Add(myGridStyle);

}



private void AddData()

{



DataRow dRow = namesDataTable.NewRow();

dRow["Name"] = "Name 1";

namesDataTable.Rows.Add(dRow);



dRow = namesDataTable.NewRow();

dRow["Name"] = "Name 2";

namesDataTable.Rows.Add(dRow);



dRow = namesDataTable.NewRow();

dRow["Name"] = "Name 3";

namesDataTable.Rows.Add(dRow);



dRow = namesDataTable.NewRow();

dRow["Name"] = "Name 4";

namesDataTable.Rows.Add(dRow);



dRow = namesDataTable.NewRow();

dRow["Name"] = "Name 5";

namesDataTable.Rows.Add(dRow);



namesDataTable.AcceptChanges();

}



private void button_Click(object o, System.EventArgs a)

{

if (grid.DataSource == namesDataSet)

grid.DataSource = null;

else

{

grid.DataSource = namesDataSet;

grid.DataMember = "NamesTable";

}

}



private void InitForm()

{

this.Size = new Size(500, 500);

grid.Size = new Size(350, 250);

grid.TabStop = true;

grid.TabIndex = 1;

button.Location = new System.Drawing.Point(200, 400);

button.Text = "bug";

button.Click += new EventHandler(button_Click);

this.StartPosition = FormStartPosition.CenterScreen;

this.Controls.Add(grid);

this.Controls.Add(button);

}



[STAThread]

public static void Main()

{

MyForm myForm1 = new MyForm();

myForm1.ShowDialog();

}

}



je cherche une méthode pour rafraichir correctement mon datagrid pour
faire disparaitre cette case même si elle est sélectionnée.

merci, de votre aide.

2 réponses

Messages postés
2
Date d'inscription
mardi 19 juillet 2005
Statut
Membre
Dernière intervention
20 juillet 2005

Merci de cette réponse, je n'y avait pas pensé mais ca ne fonctionne pas



mais en fouillant ton idéee j'ia trouver comment faire :

il suffit d'appeler le méthode Select() de la grille pour que ca fonctionne.



donc la solution est :

grid.Select();

juste avant de changer de datasource !



Merci beaucoup à toi de m'avoir orienté dans le bonne voie !
Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Statut
Membre
Dernière intervention
3 septembre 2007
3
J'ai juste parcouru ton code, pas le temps de tester, mais juste une piste.

Essaie, avant de faire ton datasource = null; de désélectionner la ligne en cours et de donner le focus à un autre controle de ta fenetre: du style :

if( datagr.CurrentRowIndex !=-1 && datagr.CurrentRowIndex <nombreMaxElement)
datagr.unselect(datagr.CurrentRowIndex);
datagr.CurrentRowIndex=-1;
application.DoEvent();
bouton.focus();
application.DoEvent();

je te laisse mettre les majuscules et tout ,

bon courage