none
在DataGridView中使用 DataTimePicker,发现修改DataTimePicker上的时间后产生了 异常 RRS feed

  • 问题

  • 我是照着msdn上做的,自己新建了一个工程,
    然后用http://msdn.microsoft.com/zh-cn/library/7tas5c80(v=vs.90).aspx
    这里的代码,发现修改DataTimePicker上的时间后产生了 异常:该字符串未被识别为有效的DataTime,这个异常怎么解决啊
    2011年8月12日 4:48

答案

  • 这个地方加一个是否为空的判断

         get
            {
                return this.Value.ToShortDateString();
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
          {
                if (value is String)
                {
                    this.Value = DateTime.Parse((String)value);
                }
                     }
             }


    http://blog.csdn.net/zx13525079024
    2011年8月12日 5:26
  • Hi 尐_Lei,

    针对您的问题,下面是我的一些操作:

    1. 直接把 MSDN 文档上面的代码,复制到 Project, 运行以后,并没有出现任何异常。

    此时,dataGridView1控件中,仅仅出现一列 column。

     

    2. 按照 MSDN 文档上面的代码,在Project 里面重现,运行以后:

    2.1 dataGridView1控件中,出现了2列 columns。
    2.2 点击第二列 column中空白的cell,会抛出异常,提示 NullReferenceException。您是不是也遇到了这个异常?

     

        对以上两种情况的源代码进行了比较:
        注意第二种情况下,下面的代码:

       public Form1()
       {
           // 相比MSDN文档,多出来的一行.
           InitializeComponent();
    
           this.dataGridView1.Dock = DockStyle.Fill;
           this.Controls.Add(this.dataGridView1);
    
            // 在InitializeComponent()方法中,也添加了此行代码.
            this.Load += new EventHandler(Form1_Load);
            this.Text = "DataGridView calendar column demo";
       }
    

          或者,可以将 InitializeComponent() 或者 Form() 中的 this.Load += new EventHandler(Form1_Load) 去掉一行,即可以解决出现两列的情况.

     

    3. 针对cell值为null,可以在 InitializeEditingControl()方法做如下改动。

        public override void InitializeEditingControl(int rowIndex, object
        initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
             base.InitializeEditingControl(rowIndex, initialFormattedValue,
                          dataGridViewCellStyle);
             CalendarEditingControl ctl =
                    DataGridView.EditingControl as CalendarEditingControl;
    
              //修改原来的代码:ctl.Value = (DateTime)this.Value;
              //
              // 值为null时,将默认值赋给它.
              if (this.Value == null)
              {
                    ctl.Value = (DateTime)this.DefaultNewRowValue;
              }
              else
              {
                    ctl.Value = (DateTime)this.Value;
               }
    

     

    希望我的回答能帮助到您!
    同时,欢迎您与大家分享该问题的任何进展。

    Have a nice day! 


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2011年8月15日 6:38
    版主

全部回复

  • 这个地方加一个是否为空的判断

         get
            {
                return this.Value.ToShortDateString();
            }
            set
            {
                if (!string.IsNullOrEmpty(value))
          {
                if (value is String)
                {
                    this.Value = DateTime.Parse((String)value);
                }
                     }
             }


    http://blog.csdn.net/zx13525079024
    2011年8月12日 5:26
  • if (!string.IsNullOrEmpty(value))这里

    参数好像不对吖

    错误 CS1503: 参数“1”: 无法从“object”转换为“string

     

     

    2011年8月12日 5:37
  • 您好

    使用 DateTime.TryParse 方法判斷是否能轉換成 DataTime

    http://msdn.microsoft.com/zh-tw/library/system.datetime.tryparse.aspx


    歡迎參觀我的Blog.NET菜鳥自救會
    2011年8月12日 5:49
  • 判断下VALUE是否为null或者是空,再试试
    http://blog.csdn.net/zx13525079024
    2011年8月12日 6:12
  • 还是不行吖.....难道我判断出错了....
    2011年8月12日 7:22
  •   public override void InitializeEditingControl(int rowIndex, object
          initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
          // Set the value of the editing control to the current cell value.
          base.InitializeEditingControl(rowIndex, initialFormattedValue,
            dataGridViewCellStyle);
          CalendarEditingControl ctl =
            DataGridView.EditingControl as CalendarEditingControl;
          if (this.Value!=null)
          {//添加是否为NULL的判断
            ctl.Value = (DateTime)this.Value;
          }
        
        }
    


    http://blog.csdn.net/zx13525079024
    2011年8月12日 8:12
  • Hi 尐_Lei,

    针对您的问题,下面是我的一些操作:

    1. 直接把 MSDN 文档上面的代码,复制到 Project, 运行以后,并没有出现任何异常。

    此时,dataGridView1控件中,仅仅出现一列 column。

     

    2. 按照 MSDN 文档上面的代码,在Project 里面重现,运行以后:

    2.1 dataGridView1控件中,出现了2列 columns。
    2.2 点击第二列 column中空白的cell,会抛出异常,提示 NullReferenceException。您是不是也遇到了这个异常?

     

        对以上两种情况的源代码进行了比较:
        注意第二种情况下,下面的代码:

       public Form1()
       {
           // 相比MSDN文档,多出来的一行.
           InitializeComponent();
    
           this.dataGridView1.Dock = DockStyle.Fill;
           this.Controls.Add(this.dataGridView1);
    
            // 在InitializeComponent()方法中,也添加了此行代码.
            this.Load += new EventHandler(Form1_Load);
            this.Text = "DataGridView calendar column demo";
       }
    

          或者,可以将 InitializeComponent() 或者 Form() 中的 this.Load += new EventHandler(Form1_Load) 去掉一行,即可以解决出现两列的情况.

     

    3. 针对cell值为null,可以在 InitializeEditingControl()方法做如下改动。

        public override void InitializeEditingControl(int rowIndex, object
        initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
             base.InitializeEditingControl(rowIndex, initialFormattedValue,
                          dataGridViewCellStyle);
             CalendarEditingControl ctl =
                    DataGridView.EditingControl as CalendarEditingControl;
    
              //修改原来的代码:ctl.Value = (DateTime)this.Value;
              //
              // 值为null时,将默认值赋给它.
              if (this.Value == null)
              {
                    ctl.Value = (DateTime)this.DefaultNewRowValue;
              }
              else
              {
                    ctl.Value = (DateTime)this.Value;
               }
    

     

    希望我的回答能帮助到您!
    同时,欢迎您与大家分享该问题的任何进展。

    Have a nice day! 


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2011年8月15日 6:38
    版主
  • Hi _Lei,
    你的问题解决了么?

    对有效的方案,别忘记Mark一下。


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年8月18日 2:33
    版主