none
DataGridViewの日付を印刷すると時間も出てしまう RRS feed

  • 質問

  • DataGridViewの日付をPrintDocumentで印刷すると、2007/05/21 00:00:00と不要な時間が印刷されます。この時間を表示しないようにするにはどうしたら良いのでしょうか。ADOのデータ設定のどこかにプロパティがあるのでしょうか。それともプログラミングで可能なのでしょうか。

     

    string dat = dataGridView[0,pos].Value.ToSring().PadRight(10)+.....

     

    e.Graphics.DrawString(dat, f, ..........

     

    で印刷しています。よろしくお願いいたします。

    2007年5月21日 11:20

回答

  • if (tbl_SubDataGridView[2, r].Value is DateTime)

    {

        dat += ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd");

    }

    else

    {

        dat += "Null value";

    }

     

    as は使えないけど is なら使えるのね。 orz

    2007年5月27日 1:14

すべての返信

  • dataGridView[0,pos].Value は Object ですが、中身はDateTime型ですので、ToSring()だと書式指定子 "G" が使用されます。

    以下のように書式設定してください。

    string dat = ((DateTime)dataGridView[0,pos].Value).ToSring("yyyy/MM/dd")+.....

     

    違いがわかって使う分にはこちらでも良いです。

    string dat = ((DateTime)dataGridView[0,pos].Value).ToSring("d")+.....

    2007年5月21日 11:47
  •  

    回答ありがとうございます。早速ためしましたが、エラーとなりました。

     

    メッセージは、

     

    指定されたキャストは有効ではありません。

     

    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10) +
                      tbl_SubDataGridView[1, r].Value.ToString().PadRight(10) +
                      ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd").PadLeft(10) +
                      tbl_SubDataGridView[3, r].Value.ToString().PadRight(10) +

     

     現在研究中です??

     

    2007年5月22日 11:24
  • その行でブレークさせて、 tbl_SubDataGridView[2, r].Value だけを選択して、

    右クリック-クイックウォッチでobjectのタイプが右端にでます。

     

    確認してください。

    ひょっとしたら文字列で突っ込んでいるんじゃないですか?

     

    objectのタイプがstringなら以下のようにしてください。

    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10) +
                      tbl_SubDataGridView[1, r].Value.ToString().PadRight(10) +
                      tbl_SubDataGridView[2, r].Value.ToString().Substring(0, tbl_SubDataGridView[2, r].Value.ToString().IndexOf(' ')).PadLeft(10) +
                      tbl_SubDataGridView[3, r].Value.ToString().PadRight(10) +

    2007年5月22日 14:31
  •  

    お世話になります。

     

    お手数お掛けいたします。

     

    確認したところ、objectのタイプはDateTimeのようです。

     

    -  tbl_SubDataGridView[2, r].Value {2007/05/23 0:00:00} object {System.DateTime}

    上記はその自動変数のコピーです。

     

    いかがでしょうか。

    2007年5月22日 21:51
  • あれ。

     ((DateTime)(tbl_SubDataGridView[2, r].Value))  っていうふうに多めにカッコが必要だったっけか。

    2007年5月23日 2:42
  • 横から失礼します。
    #「多めのカッコ」はいらないです(^^;

    高柳さんが確認された値ですが、もしかしてブレークポイントで止めた時の値ではないでしょうか?
    その時の行の値は DateTime 型で、キャストエラーが発生しているのは他の行だとか。
    一度、キャストエラー発生時の自動変数を確認してみてください(すでにそうされていたのであればすみません)。
    例えばエラー時の値は DBNull.Value だったり。
    #もし解決したら、えムナウさんとこに回答済みマークを付けましょう!

    2007年5月23日 8:36
  • >#「多めのカッコ」はいらないです(^^;

    TH01さんフォローありがとうございます。

     

    高柳さん。

    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10) ;

    dat += tbl_SubDataGridView[1, r].Value.ToString().PadRight(10) ;
      dat += ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd").PadLeft(10);
      dat += tbl_SubDataGridView[3, r].Value.ToString().PadRight(10) ;

     

    こんな感じに分割すればどこが悪いかわかりますよ。

    2007年5月23日 11:30
  •  

     

    えムナウさん お世話になります。

     

    TH01さんフォローありがとうございます。

     

     まだ苦戦中です。 

     

    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10) ;

    dat += tbl_SubDataGridView[1, r].Value.ToString().PadRight(10) ;
      dat += ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd").PadLeft(10);
      dat += tbl_SubDataGridView[3, r].Value.ToString().PadRight(10) ;

    で試しました。

     

      dat += ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd").PadLeft(10);

     

    でエラーになります。 メッセージは以下のとおりです。

     

    "指定されたキャストは有効ではありません。"

     

     型はDatetimeです。

     

     お手数お掛けいたしますが、何か良い案はないでしょうか。

    2007年5月24日 11:56
  • 実際にやってみました。

    DataGridViewの0,0のセルにDateTime型で日付を入れてみて以下の行は通りました。

    string dat = ((DateTime)tbl_SubDataGridView[0, 0].Value).ToString("yyyy/MM/dd").PadLeft(10);

     

    そこで以下のようにやってみてください。

    DateTime datework = (DateTime)tbl_SubDataGridView[2, r].Value;

    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10) ;

    dat += tbl_SubDataGridView[1, r].Value.ToString().PadRight(10) ;
      dat += datework.ToString("yyyy/MM/dd");
      dat += tbl_SubDataGridView[3, r].Value.ToString().PadRight(10) ;

     

    型がDateTimeでなければ最初の行で「"指定されたキャストは有効ではありません。"」になります。

    型がDateTimeなら全部うまく通るはずです。

     

    最初の行で「"指定されたキャストは有効ではありません。"」になるなら型がDateTimeでないので、

    そのときのrの値とtbl_SubDataGridView[2, r].Valueを確認してください。

     

    rの値によってtbl_SubDataGridView[2, r].Valueに日付ではない値(DBNull.Valueとか)が入っているかもしれません。

     

    もしそういう時は何を印刷する仕様になっているかも書いてください。

     

    2007年5月24日 15:38
  •  

     お世話になります。  づつと研究をしておりました。

     

     エラーの原因がわかりました。DBNull.Valueの関係です。試しにすべての日付のDataGridView項目に、

     

     日付を入れたら問題なく日付のみで印刷できました。

     

        int r = 0;
                while (r < tbl_SubDataGridView.RowCount - 1)
                {

                    DateTime datework = (DateTime)tbl_SubDataGridView[2, r].Value;

                    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10);

                    dat += tbl_SubDataGridView[1, r].Value.ToString().PadRight(10);
                    dat += datework.ToString("yyyy/MM/dd");
                    dat += tbl_SubDataGridView[3, r].Value.ToString().PadRight(10);
                    dat += tbl_SubDataGridView[4, r].Value.ToString().PadRight(10);
                    dat += tbl_SubDataGridView[5, r].Value.ToString().PadRight(10);


                    e.Graphics.DrawString(dat, f, Brushes.Black, x, y + (pitch * r));

                    r = r + 1;
                }

     

        この日付は、登録日なものでDBNull.Valueでも印刷可能な方法は、あるのでしょうか。

      

        ご教授いただければ幸いです。お手数おかけしますが、よろしくお願いいたします。 

    2007年5月26日 4:32
  • while (r < tbl_SubDataGridView.RowCount - 1)
                {

                    string dat = tbl_SubDataGridView[0, r].Value.ToString().PadRight(10);

                    dat += tbl_SubDataGridView[1, r].Value.ToString().PadRight(10);
                     DateTime datework = tbl_SubDataGridView[2, r].Value as DateTime;

                  if (datework  != null)

                  {

                        dat += datework.ToString("yyyy/MM/dd");
                     }

                   else

                  {

                       dat += "Null value";

                  }

                   dat += tbl_SubDataGridView[3, r].Value.ToString().PadRight(10);
                    dat += tbl_SubDataGridView[4, r].Value.ToString().PadRight(10);
                    dat += tbl_SubDataGridView[5, r].Value.ToString().PadRight(10);


                    e.Graphics.DrawString(dat, f, Brushes.Black, x, y + (pitch * r));

                    r = r + 1;
                }

    2007年5月26日 15:34
  •  

    えムナウ  さま

     

    お世話になります。お手数お掛けいたします。

     

     DateTime datework = tbl_SubDataGridView[2, r].Value as DateTime;

     

    のas 演算子でエラーになってしまいます。

     

     エラー 1 as オペレータは参照型で使用してください ( 'System.DateTime' は値の型です )。 

     

     よろしくお願いいたします。
    2007年5月26日 23:20
  • if (tbl_SubDataGridView[2, r].Value is DateTime)

    {

        dat += ((DateTime)tbl_SubDataGridView[2, r].Value).ToString("yyyy/MM/dd");

    }

    else

    {

        dat += "Null value";

    }

     

    as は使えないけど is なら使えるのね。 orz

    2007年5月27日 1:14
  •  

     えムナウ さん

      

     お世話になりました。希望していた印刷になりました。

     

     詳細で、迅速なご指導ありがとうございます。

     

     とても、助かりました!!

     

     

     

     

    2007年5月27日 5:03