2

私は 2 つの DataGridViews (DGV) を持っており、両方にフォーマットしたい通貨列があります。私が書いているコードは、一方では機能するようですが、他方では機能しないようです。

両方の DGV は次のように設定されています。データは最初に DataTable にロードされます。次に、BindingSource がこの DataTable にリンクします。最後に、DGV はこの BindingSource オブジェクトをデータに使用します。

フォームの Load イベントで次のコードを使用して、両方の DGV の通貨列をカスタマイズします。

dataGridView.Columns[columnIndexHere].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("de-DE");
dataGridView.Columns[columnIndexHere].DefaultCellStyle.Format = String.Format("c")

一方のDGVで列をフォーマットしているようです。また、動作していない DGV には、親フォームにそれほど多くの機能コードがありません..コードと DGV のプロパティをチェックして、フォーマットを別の場所で変更しているかどうかを確認しましたが、何も見つかりませんでした..

2 つの DGV がデータをロードする方法の唯一のわずかな違いは、最初の DGV の DataTable (書式設定が機能する) では、データが SELECT ステートメントを介して (自分の関数を介して) ロードされることです... 2 番目の DGV の DataTable では (このシナリオではユーザーがデータを入力する必要があるため、DB からデータをロードせず、(DataTable で) 列を手動で定義するだけです。

2 番目の DGV でフォーマットが機能しない理由の手がかりはありますか?


編集:詳細情報の追加:

この問題を実証するために、新しい C# winforms プロジェクトを作成し、それに DataGridView を 1 つだけ追加して、次のコードを Load イベントに追加しました。このコードでも、通貨の書式設定は行われていません。

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ColA");
dataTable.Columns.Add("ColB");
dataTable.Columns.Add("ColC");


dataTable.Rows.Add("John", 832.293, "London");
dataTable.Rows.Add("Alice", 32972978.20489, "Atlanta");
dataTable.Rows.Add("Mark", 9184793284739, "Tokyo");

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;

dataGridView1.DataSource = bindingSource;

var format = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
format.CurrencySymbol = "Mn. ";
dataGridView1.Columns["ColB"].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("de-DE");
dataGridView1.Columns["ColB"].DefaultCellStyle.Format = String.Format("c");

これが問題の診断に役立つことを願っています..

4

2 に答える 2

2

BindingSourceすべての行をリストする必要はありません。

dataGridView1.DataSource = dataTable

を使用しているDataTableため、この部分を削除します

dataGridView1.Columns["ColB"].DefaultCellStyle.Format = String.Format("c");

CellFormattingイベントを使用してみてください。

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 1) //Column ColB
            {
                if (e.Value != null)
                {
                    e.CellStyle.Format = "c";
                }
            }
        }

それが役立つことを願っています:)

于 2012-12-25T13:45:31.163 に答える