10032
DataGridView で、小数点以下2桁を表示させたいのですが、うまくいきません。

* * *
```

    Protected Sub InitializeControlDataGridView_dgvXyz()
        Try
            With Me.dgvGosa()
                .Dock = DockStyle.Fill
                .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
    
                ' 初期化
                .DataSource = Nothing
    
                ' 列幅の設定
                .Columns(EnumColOrder.Feed).Width = 100
                .Columns(EnumColOrder.StartPoint).Width = 150
                .Columns(EnumColOrder.MidPoint).Width = 150
                .Columns(EnumColOrder.EndPoint).Width = 150
    
                Me.InitializeControlDataGridView_dgvXyzHeaderText()
    
                ' 表示フォーマットの設定
                .Columns(EnumColOrder.StartPoint).DefaultCellStyle.Format = "F2"
                .Columns(EnumColOrder.MidPoint).ValueType = GetType(Double)
                .Columns(EnumColOrder.MidPoint).DefaultCellStyle.Format = "#,##0.00"
                .Columns(EnumColOrder.EndPoint).DefaultCellStyle.Format = "N2"
    後略
    
```

* * *
```

    Protected Function GetDataSource() As DataSet
        Try
    (中略)
                Dim addRow As DataRow = dataTable.NewRow
    
                addRow(EnumColOrder.Feed) = record.RNo
                addRow(EnumColOrder.StartPoint) = CType(record.XCoordinates, Double)
                addRow(EnumColOrder.MidPoint) = CType(record.YCoordinates, Double)
                addRow(EnumColOrder.EndPoint) = CType(record.ZCoordinates, Double)
    
                dataTable.Rows.Add(addRow)
    
```

* * *

ぐぐってみたところ、`DefaultCellStyle`は値が`string`では反映されないとのことで、`Double`にキャストしている(つもり)なんですが、表示結果は小数点以下を表示しません。

たぶん初歩的なところで間違っていると思いますので、コメントいただける方、よろしくお願いします。
CC BY-SA 3.0
2015-05-11T04:47:13.020
10027
2015-05-11T08:03:54.293
2015-05-11T05:33:06.817
5750
9674
question
winforms vb.net
VB2008 DefaultCellStyle.Format の設定が反映されない
型付データセットデザイナーを使用した場合の`DataColumn.DataType`の変更方法です。

![型付データセットデザイナー](https://i.stack.imgur.com/K230J.png)

  1. (ない場合)プロジェクトにデータセットを追加します。
  2. データセットに既存の`DataTable`(ここではOriginalRecord)と同じスキーマのテーブル(例：ConvertedRecord)を作成します。
  3. 型を変更する列(例：ConvertedRecord.XCoordinates)を選択し、`DataType`に`System.Double`を選択します。(変更しない列も元のテーブルと同じ`DataType`であることを確認します。)

値を移し替える場合は以下のようにします。

```

    ' Dim originalTable As DataTableが引数
    Dim convertedTable As New SomeDataSet.ConvertedRecordDataTable()
    For Each sr As DataRow In originalTable.Rows
        Dim dr = convertedTable.NewRow()
        dr.ItemArray = sr.ItemArray
        convertedTable.Rows.Add(dr)
    End For
    
    ' DataSourceにconvertedTableを設定する
    
```

また読み取り専用であれば`DataColumn.Expression`を使用する手もあると思います。

## 動的にスキーマを変更する場合

`DataTable.Clone()`を用いるとテーブルの構造がコピーできます。レコードがなければ`DataColumn.DataType`の値を変更できるので、

```

    Dim convertedTable = originalTable.Clone()
    convertedTable.Columns(1).DataType = GetType(Double)
    ' Columnsを変更したら上のFor Eachでデータを移す
    
```

のように変更後のテーブルを実行時に構成することができます。
CC BY-SA 3.0
2015-05-11T07:00:09.720
10032
2015-05-11T08:03:54.293
2020-06-17T08:14:45.997
-1
5750
10027
answer