none
DataTableでstring以外の型を持つカラムにnullを許可したい RRS feed

  • 質問

  • カラムの型がSystem.string以外の時、NullValueプロパティに(Null)を指定できません。

    DBだと普通にnullを許可するdecimal型などのフィールドがあるので、非常に不便です。

    回避策として考えたのは

    1.decimalなどをあきらめてDataTable側をstringにする。

    2.使用されないはずの値をnullとして扱う。

    どちらもDataTableを使う側で注意しなければならず、微妙です。

    皆さんはどうされてるのでしょうか?

    @ITの下記のスレッドでも結論は出てないみたいですし・・・

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20462&forum=7&4

    2006年2月17日 14:50

すべての返信

  • GDNJ でのVS2005の板の流れだと,

    this.birthDateTextBox.DataBindings.Add(
       
    new System.Windows.Forms.Binding(
           
    "Text", this.table1BindingSource, 
            "BirthDate", true));

    のところを

    this.birthDateTextBox.DataBindings.Add(
       
    new System.Windows.Forms.Binding(
           
    "Text", this.table1BindingSource,
            "BirthDate", true,
            System.Windows.Forms.DataSourceUpdateMode.OnValidation,
            string.Empty));

    とする...かな。
    ただし,デザイナから書き換えられる恐れがあるので,
    注意するか,既定のエディタをCSharpフォームエディタからCSharpエディタに変えておくとか...
    もしくは,
    DataBindings の 詳細 の ... をクリックして,
    Null値 のところに何かを入れるんだけど,それだと何か入れないといけないんですよね。

    2003でなら,
    Bindingオブジェクトの Parse や Formatのイベントを実装でしょう。

    2006年2月17日 18:45
  • デザイナが,"" 要するに,String.Empty を認識できないので,
    指定できなかったり,不用意に,消えてしまったりします。

    できたら,これに皆さん Voteして欲しいんですが...

    Suggestion Details: WinForms Designer should support String.Empty for null value for bound controls

    年末の VS2005 SP1 に今なら間に合うと思うので。

    2006年2月17日 19:54
  • SP1ではそのレベルの修正はされないのじゃないだろうか・・・(^^;;

    私のWishもよろしく(^^

    http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=57b554ac-3d35-4a93-9fdc-a49fd61085fb

    DataSetにすべてNullableをサポートすれば全般的に解決すると思います。

    #簡単ではないでしょうけど

    2006年2月18日 1:42
  • 稍丼さん、返信ありがとうございます。

    何らかのコントロールにバインドしない状態でDataTableを使用しているので、ちょっと意味が違うような・・・

    それはともかく、バインドするときには参考にさせていただきます。

    コントロール側もNullableに対応しないと意味がないのでVoteしておきました。

     

    中博俊さん、返信ありがとうございます。

     中博俊 は書きました:

    DataSetにすべてNullableをサポートすれば全般的に解決すると思います。

    #簡単ではないでしょうけど

    そうですねえ、DBと対応するはずの入れ物がDBのサブセットでしかない状態は非常に残念です。

    なのでVoteしておきました。

    .NET3.0といわず、.NET2.1でサポートされるといいですねえ・・・

    2006年2月18日 3:20
  • あれ? 別な意味にとってたんですね。

    ただ,@ITの方は,DataGridと連携している例で,
    DataGridView の場合は,
    内部で型変換(int <--> String や DateTime <--> String)しるようなので,
    問題は起きないような。 

    型付きDataSetが,Nullable をサポートしても,
    TextBox の Textプロパティが,String型である限り,
    やっぱりどこかで型変換機能(Type Converter)が必要な気がするんですよね。
    今回は,Textプロパティだけど,
    int型 で年齢とかを扱っていて,
    ForeColorプロパティと連結して,数値によって,
    色を変えるのなら,int --> Color のような型変換も必要になるし。

    その型変換の場所としてBindingオブジェクトを
    .NET Framework側が用意してくれているので
    やっぱりそれとつき合うことになるんじゃないかな。
    例のWPF本を読むと,WPFでもそうなっているようだし...
    (25才以上は,かっこいいから,赤色 にするとかあったけど,
    米国でも赤なんですね... )

    WPFのというか,
    System.Windows.Controls の TextBox  の Textプロパティも
    String型ですし...
    Nullable<int> と String の型変換機能(convert, convertback)が
    必要になってくるので,結局一緒のような気がします。

     

    ただ,型付きDataSetで,いちいち Is...Nullでチェックするのは,
    面倒ですね...。
    この自動コーディング出力?は,SP1 で変更してほしいなぁ。

    中さんのも,Voteしておきました。
    でも,Postponed でなく By Design になってますね...
    (Suggestion に対して,By Design とは,う~ん)
    これって,もう一度上げないと,たぶん,次もスルーされかねないかも。
    それに,SP1 でやらないのなら,
    VBやC++/CLIが,Nullableをサポートするまで待つとしたら,
    次は,DLINQになってしまうような...)

    2006年2月18日 19:07
  • >1.decimalなどをあきらめてDataTable側をstringにする。

    で、逃げるのが今のところ一般的でしょう。たぶん。

    中さんが言われるようにDataSetでもNullableがサポートするのが違和感無いと思います。LINQプロジェクトの一環で、当然サポートされてくると思ってます。

    2006年2月19日 9:08
    モデレータ
  • ByDesigned だっていわれればしゃーないかなって。

    まぁNullable自体も最後まで実装でゆれていたっていうのもありますし、LINQがらみで3.0でサポートしてくれると信じています。

    #一時のCTPのバージョンではもう少しNullable採用していましたが、最終的に最小限にしか取り込まれていないようです。

    2006年2月19日 10:02