1

タイプDataGridViewComboBoxCellを含む列を更新するメソッドがあり、初期のComboBoxCellは空で、製品を選択し、新しいレコードの追加がうまくいくとComboBoxCellが更新されますが、変更すると例外が送信されます:「DataGridViewComboBoxCell値が無効です" DataSource プロパティを再割り当てする場合はそうではありません。

ここで方法:

private void CargarTipoGasto(ref DataGridViewComboBoxCell ComboColumn)
{
   ComboColumn.DataSource = from oPro in dtContext.tblProducto
                            where oPro.ProductoId == objProducto.ProductoId
                            from oMat in dtContext.tblMatrizDeCuentasGD
                            where oMat.Partida.Substring(0,3) ==
                              oPro.tblObjetoGasto.ObjetoGastoId.Substring(0,3)
                            from oTipGas in dtContext.tblTipoGasto
                            where oMat.TipoGasto == oTipGas.TipoGastoId
                            select oTipGas;

   ComboColumn.ValueMember = TIPOGASTO_ID;
   ComboColumn.DisplayMember = TIPOGASTO_VALOR;
}

null 値がないこと、参照が適切であることを確認してください

助けてくれてどうもありがとう

4

2 に答える 2

2

私はすでに BindingList を使用しようとしていましたが、ポルフィンで解決できるのと同じ例外が発生しました。

インデックス ミスで見つからない選択項目を指定する DataSource プロパティを返します。このフォーラムを回避するには、DataGridView に「DataError」があるというイベントのみを指定し、空のままにしておきます。これは実際には機能しますが、よくわかりません。

それを解決する方法はこの簡単な方法でした。(文字列が空)

private void CargarTipoGasto(ref DataGridViewComboBoxCell ComboColumn)
{
   ComboColumn.Value = string.Empty;
   ComboColumn.DataSource = from oPro in dtContext.tblProducto
                            where oPro.ProductoId == objProducto.ProductoId
                            from oMat in dtContext.tblMatrizDeCuentasGD
                            where oMat.Partida.Substring(0,3) ==
                              oPro.tblObjetoGasto.ObjetoGastoId.Substring(0,3)
                            from oTipGas in dtContext.tblTipoGasto
                            where oMat.TipoGasto == oTipGas.TipoGastoId
                            select oTipGas;

   ComboColumn.ValueMember = TIPOGASTO_ID;
   ComboColumn.DisplayMember = TIPOGASTO_VALOR;
}

助けてくれてどうもありがとう (IBC)

于 2011-11-04T14:52:02.070 に答える
0

http://msdn.microsoft.com/en-us/library/ms132679.aspxにアクセスしてください。

これは BindingList です。コンボカラム データをバインディング リストに入れ、コンボカラムのデータソースをバインディング リストに設定してみてください。コンボボックスの内容を変更する必要がある場合は、列のデータソースを別の bindingList インスタンスに設定するのではなく、元のバインディング リストのすべての項目をクリアして、そこに新しい項目を 1 つずつ追加してみてください。バインディング リストの listChanged イベントが発生すると、datagridviewcombobox が更新されます。

bindinglist に多くの項目が含まれている場合、これはちょっと面倒です。bindinglist から継承する新しいクラスを作成し、これをその中に入れたいと思うかもしれません:

public void clearAndAddList(List<T> newData)
    {
        this.Clear();

        this.RaiseListChangedEvents = false;
        foreach (var item in newData)
            this.Add(item);
        this.RaiseListChangedEvents = true;

        this.ResetBindings();
    }

これにより、項目を追加するたびに listchanged イベントが発生するのを防ぎます。ResetBindings は、listchanged を起動するのと同じ効果があるようです。

この問題にはおそらくより良い解決策がありますが、これは過去に私にとってはうまくいきました。

于 2011-11-04T06:51:27.867 に答える