web-dev-qa-db-fra.com

Liaison DataGridViewComboBoxCell - "la valeur n'est pas valide"

J'essaie de lier des cellules ComboBox distinctes dans un DataGridView à une classe personnalisée et continue de recevoir une erreur

La valeur de DataGridViewComboBoxCell n'est pas valide

J'assigne actuellement la source de données pour la cellule à un IList<ICustomInterface> à partir d'un dictionnaire que j'ai. Lors de la définition de la source de données, cependant, l'index pour ComboBoxCell n'est pas défini et une valeur non valide est sélectionnée.

J'essaie de comprendre comment l'obtenir pour sélectionner une valeur réelle, par exemple. Le 0ème élément de la liste vous a été attribué pour supprimer cette erreur ou pour trouver un autre moyen de résoudre le problème. Quelqu'un a des suggestions?

25
Ian

J'ai réussi à trouver la solution peu de temps après la publication de la question. Pour quelqu'un d'autre:

Le problème était que j'essayais d'assigner le DataGridViewComboBoxCell.Value à un objet, en espérant que, parce que la cellule était liée à une source de données, l'objet serait automatiquement trouvé dans la source et mis à jour.

Ce n'était pas réellement le cas, vous devez définir la valeur égale à celle de la propriété ValueMember pour qu'elle mette à jour correctement la valeur et la liaison. Je crois que j'utilisais une propriété 'Nom' pour ValueMember et DisplayMember (contrôle le rendu dans la cellule), donc définir Value sur interface.ToString() (plutôt que l'instance d'interface) fonctionne dans la majorité des cas. Ensuite, j'attrape et ignore les exceptions DataError qui se produisent lorsque je change de source.

31
Ian

Voici ma solution simple lorsque vous utilisez enums

ColumnType.ValueType = typeof (MyEnum);
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum));

vous pouvez le faire juste après "InitializeComponent ();"

12
Sauleil

Après des heures d’essais, j’ai finalement trouvé une solution qui fonctionne.

// Create a DataGridView
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView();

// Create a DataGridViewComboBoxColumn
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn();

// Add the DataGridViewComboBoxColumn to the DataGridView
dgvCombo.Columns.Add(colCombo);

// Define a data source somewhere, for instance:
public enum DataEnum
{
    One,
    Two,
    Three
}

// Bind the DataGridViewComboBoxColumn to the data source, for instance:
colCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Create a DataGridViewRow:
DataGridViewRow row = new DataGridViewRow();

// Create a DataGridViewComboBoxCell:
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell();

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn:
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance:
cellCombo.Value = "Two";
// (No need to set values for DisplayMember or ValueMember.)

// Add the DataGridViewComboBoxCell to the DataGridViewRow:
row.Cells.Add(cellCombo);

// Add the DataGridViewRow to the DataGridView:
dgvCombo.Rows.Add(row);

// To avoid all the annoying error messages, handle the DataError event of the DataGridView:
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError);

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    // (No need to write anything in here)
}

C'est tout.

3
NaSo

J'ai eu le même problème.

Dans mon cas, la solution consistait à remplir l’adaptateur de données de la table de clés étrangères. Ce n'était pas automatiquement rempli et c'était la cause du problème.

Dans l'événement Page_Load:

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes)
2
Mark Jarzebowski

utiliser le gestionnaire d'événements DataError,

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            //You don't have to write anything here !
        }

et vos types de données DisplayMember et ValueMember doivent être identiques, dans mon cas, j'ai CountryName pour les deux. Tout fonctionne bien pour moi ... !!

1
Md Shahriar

J'ai le même problème. Après avoir renseigné ma colonne ComboBox dans le DataGrid (indépendant), j'ai résolu mon problème en définissant la propriété ValueMember de la DataGridViewComboBoxColumn Apparemment, il ne suffit pas de compter sur la propriété ToString() des objets de la ComboBox. 

Code actuel:

/// <summary>
/// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan.
/// </summary>
/// <param name="bonus"></param>
private void PopulateDataGridSplitVolumes(Bonus_Group bonus)
{
  try
  {
    List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString);
    foreach (Qualification qual in qualifications)
    {
      DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0];
      col.Items.Add(qual);                    
    }
    SplitVolumeGrid_QualificationColumn.ValueMember = "Name";
  }
  catch (Exception ex)
  {
#if DEBUG
    System.Diagnostics.Debugger.Break();
#endif
    throw ex;
  }
}//PopulateDataGridSplitVolumes     
1

Définissez une valeur null pour la cellule:

dataGridView.CurrentRow.Cells[NAME].Value = null;
0
Varo

Pour que les gens ne luttent pas autant que moi.

Lorsque vous liez le combo, vous définissez un DisplayMember (ce que l’utilisateur verra) Et un ValueMember (ce que votre application obtiendra).

Une fois ces paramètres configurés, vous devez définir la valeur, et c’est à ce niveau-là qu’elle échoue.

Ainsi, si votre membre de valeur est un ID, il est évident qu'il est de type INT et que vous devez définir votre valeur sur int, par exemple Cell.Value = 1 ;.

0
SubqueryCrunch

J'avais le même problème. Le message était à 100% sur place. Les valeurs de la liste déroulante étaient les suivantes: Exact, StartsWith ... et j'essayais de définir la valeur Exactă (pas Exact). Cela se produisait automatiquement alors que je lisais le DataTable pour le DataGridView à partir d'un fichier .xml avec DataTable.ReadXml (...). Les valeurs du fichier .xml étaient désactivées.

0
GoTo