DataTable値の型変換

解決


トシ  2009-05-25 21:01:22  No: 145931

お世話になります。
VISTA(VB2008 SQLSERVER2005)でプログラムを開発しています、
戸惑ってしまい教えて頂きたく投稿しました。

フォームにコマンドボタンとデータグリッドビューを貼り付け
ボタンをクリックすることにより、得意先売上額順に得意先名を
データグリッドビューに表示するプログラムを作っています。

SQLデータベースの型
得意先売上額 varchar(9) 得意先名 varchar(40)

※問題の現象
得意先売上額セルのカンマ編集が出来ません。

得意先売上額をnumeric(9,0)にすると編集されるのですが、
作成したプログラム資産の関係により今からの型変更は難しいのです。

データテーブルの値をデータソースにセットする前に、型変換するなど
して解決できないでしょうか?
いろいろと考えましたが解決できません、よろしくお願いします。

Imports System.Data.SqlClient
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Using cn As New SqlConnection(My.Settings.SqlConnectionString)
            cn.Open()
            Dim sql As String
            Dim table As New DataTable

            sql = "SELECT 得意先売上額,得意先名 FROM 得意先 ORDER BY 得意先売上額"

            Dim Adapter As New SqlDataAdapter(sql, cn)
            Adapter.Fill(table)

            DataGridView1.DataSource = table

            DataGridView1.Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
            DataGridView1.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            DataGridView1.Columns(0).DefaultCellStyle.Format = "###,###,##0"
            DataGridView1.Columns(0).Width = 120

            DataGridView1.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft
            DataGridView1.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
            DataGridView1.Columns(1).Width = 200
        End Using
    End Sub
End Class


魔界の仮面弁士  2009-05-26 04:14:50  No: 145932

表示のみの目的であれば、SQL の時点で
http://yaplog.jp/orator/archive/38
のようにして、文字列として取得してやれば良いかと。

あるいは、DataTable 側に式列を追加するとか。

table.Columns.Add("額", GetType(Decimal), "CONVERT(得意先売上額, System.Decimal)").SetOrdinal(0)
table.Columns("得意先売上額").SetOrdinal(2)
DataGridView1.DataSource = table
DataGridView1.Columns(2).Visible = False

DataGridView1.Columns(0).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleRight
DataGridView1.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
DataGridView1.Columns(0).DefaultCellStyle.Format = "###,###,##0"
DataGridView1.Columns(0).Width = 120

DataGridView1.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft
DataGridView1.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
DataGridView1.Columns(1).Width = 200

もしくは、Decimal 型の列を持った DataTable に転写するとか。

Dim dummyTable As DataTable = table.Clone()
dummyTable.Columns("得意先売上額").DataType = GetType(Decimal)
Using stm As New MemoryStream()
    table.WriteXml(stm)
    stm.Flush()
    stm.Seek(0, SeekOrigin.Begin)
    dummyTable.ReadXml(stm)
    stm.Seek(0, SeekOrigin.End)
    stm.Close()
End Using
DataGridView1.DataSource = dummyTable


トシ  2009-05-26 18:18:21  No: 145933

魔界の仮面弁士さんご回答ありがとうございます。

色々解決策があるんですね、驚きました。
2番目の方法で解決しました、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加