Je descends une table de jeu de données fortement typée dans un datagridview. puis en ajoutant une colonne de zones de liste déroulante pour laisser les clés étrangères être sélectionnées par nom au lieu de l'ID. Il y a peut-être un moyen plus simple de le faire.Pourquoi mon DataGridviewColumn n'accepte-t-il pas les modifications à ce stade?
puis-je transformer la colonne typeID en colonne de liste déroulante tout en étant capable de renvoyer la source de données à mon type de table de jeu de données fortement typé? Ai-je besoin de le récupérer à partir de la source de données ou est-ce que les modifications apportées à datagridview sont automatiquement renvoyées à l'ensemble de données?
Quel est le problème avec ce code?
FormDg fDg;
internal DsTech.TechObjectsDataTable ShowDg(IWin32Window owner, Db db)
{
fDg = new FormDg();
fDg._dg.DataSource = db.getDs().TechObjects;
var TypeSelecter = new DataGridViewComboBoxColumn();
var types = db.getdsObjectTypes();
TypeSelecter.DataSource = types;
TypeSelecter.DisplayMember = "type";
TypeSelecter.Name = "Types";
TypeSelecter.ValueMember = "ID";
fDg._dg.Columns["typeID"].DisplayIndex=fDg._dg.Columns.Count-1;
fDg._dg.Columns.Add(TypeSelecter);
fDg._dg.ReadOnly = false;
Application.DoEvents();
for (int i = 0; i < fDg._dg.RowCount; i++)
{
if ((fDg._dg.Rows[i].Cells["typeID"].Value is DBNull) == false)
//Line below does not work
UpdateTypesRow(i,(int)fDg._dg.Rows[i].Cells["typeID"].Value);
}
fDg._dg.CellEndEdit += new DataGridViewCellEventHandler(_dg_CellEndEdit);
if (fDg.ShowDialog(owner) == DialogResult.OK)
{
return (DsTech.TechObjectsDataTable)fDg._dg.DataSource;
}
else return null;
}
Bien que ce code fonctionne très bien
void _dg_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (fDg._dg.Columns[e.ColumnIndex].Name == "Types")
{
fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value = fDg._dg.Rows[e.RowIndex].Cells["Types"].Value;
//update typeID column
}
else if (fDg._dg.Columns[e.ColumnIndex].Name == "typeID")
{
//update types column
UpdateTypesRow(e.RowIndex,(int) fDg._dg.Rows[e.RowIndex].Cells["typeID"].Value);
}
}
Voici le code que je factoré 2 en juste au cas où je lisais mal et ils étaient en fait différents
void UpdateTypesRow(int rowIndex, int value)
{
fDg._dg.Rows[rowIndex].Cells["Types"].Value = value;
}