Showing posts with label nullable. Show all posts
Showing posts with label nullable. Show all posts

Wednesday, October 21, 2009

Nullable ComboBox.SelectedValue

Here's what I hacked out of the nullable DateTimePicker to work for the SelectedValue property of a ComboBox



        /// <summary>
        /// From BReusable
        /// </summary>
        /// <param name="comboBox"></param>
        /// <param name="dataSource"></param>
        /// <param name="valueMember"></param>

        /// <remarks>With help from Dan Hanan at http://blogs.interknowlogy.com/danhanan/archive/2007/01/21/10847.aspx</remarks>

        public static void BindNullableSelectedValue(this ComboBox comboBox, BindingSource dataSource, String valueMember)

        {

            
var binding = new Binding(Member.Name<ComboBox>(item=>item.SelectedValue), dataSource, valueMember, true);



            
//OBJECT PROPERTY --> CONTROL VALUE

            binding.Format += ((sender, e) =>

            {

                
Binding b = sender as Binding;



                
if (b != null)

                {

                    
var  cBox = (binding.Control as ComboBox);

                    
if (cBox != null)

                    {

                        
if (e.Value == null)

                        {



                            cBox.SelectedItem=
null;



                        }


                    }



                }

            });

            
// CONTROL VALUE --> OBJECT PROPERTY

            binding.Parse += ((sender, e) =>

            {

                
// e.value is the formatted value coming from the control.
                // we change it to be the value we want to stuff in the object.

                var b = sender as Binding;



                
if (b != null)

                {

                    
var cBox = (b.Control as ComboBox);

                    
if (cBox != null)

                    {

                        e.Value = cBox.SelectedItem !=
null ? cBox.SelectedValue : null;

                    }

                }

            });

            comboBox.DataBindings.Add(binding);



        }




- Formatted via Jeff Atwood's - ModernText Visual Studio Macro

nullable DateTimePicker databinding

Code or special controls to allow a DateTimePicker to accept a nullable value are all over the place. Here's the one I'm using that is working well so far.

/// <summary>

        /// From BReusable

        /// </summary>

        /// <param name="dateTimePicker"></param>

        /// <param name="dataSource"></param>

        /// <param name="valueMember"></param>

        /// <param name="showCheckBox"></param>

        /// <remarks>With help from Dan Hanan </remarks>

        public static void BindNullableValue(this DateTimePicker dateTimePicker, BindingSource dataSource, String valueMember,bool showCheckBox)

        {

            var binding = new Binding("Value", dataSource, valueMember, true);



            //OBJECT PROPERTY --> CONTROL VALUE

            binding.Format += ((sender, e) =>

                                   {

                                       Binding b = sender as Binding;

                

                                       if (b != null)

                                       {

                                           DateTimePicker dtp = (binding.Control as DateTimePicker);

                                           if (dtp != null)

                                           {

                                               if (e.Value == null)

                                               {



                                                   dtp.ShowCheckBox = showCheckBox;

                                                   dtp.Checked = false;



                                           // have to set e.Value to SOMETHING, since it's coming in as NULL
                                           // if i set to DateTime.Today, and that's DIFFERENT than the control's current
                                           // value, then it triggers a CHANGE to the value, which CHECKS the box (not ok)
                                           // the trick - set e.Value to whatever value the control currently has. 
                                           // This does NOT cause a CHANGE, and the checkbox stays OFF.



                                                   e.Value = dtp.Value;



                                               }

                                               else

                                               {

                                                   dtp.ShowCheckBox = showCheckBox;

                                                   dtp.Checked = true;

                                           // leave e.Value unchanged - it's not null, so the DTP is fine with it.

                                               }



                                           }



                                       }

                                   });

            // CONTROL VALUE --> OBJECT PROPERTY

            binding.Parse += ((sender, e) =>

                                  {

                                      // e.value is the formatted value coming from the control. 

                                      // we change it to be the value we want to stuff in the object.

                                      var b = sender as Binding;



                                      if (b != null)

                                      {

                                          var dtp = (b.Control as DateTimePicker);

                                          if (dtp != null)

                                          {

                                              if (dtp.Checked == false)

                                              {

                                                  dtp.ShowCheckBox = showCheckBox;

                                                  dtp.Checked = false;

                                                //used to cast null to dateTime?

                                                  e.Value = null;

                                              }

                                              else

                                              {

                                                  DateTime val = Convert.ToDateTime(e.Value);

                                                  e.Value = val;

                                              }

                                          }

                                      }

                                  });

            dateTimePicker.DataBindings.Add(binding);



        }

Monday, September 7, 2009

DataTimePicker databinding vs nullable DateTime

I just came across an interesting problem. You can't bind a nullable dateTime directly to a dateTimePicker. At least not easily. Here's an extension method that handles the heavy lifting.


/// <summary>
/// 
/// </summary>
/// <param name="dtp"></param>
/// <param name="dataSource"></param>
/// <param name="valueMember"></param>
/// <remarks>With help from Dan Hanan at http://blogs.interknowlogy.com/danhanan/archive/2007/01/21/10847.aspx</remarks>
public static void BindNullableValue(this DateTimePicker dateTimePicker, BindingSource dataSource, String valueMember)
{
var binding = new Binding("Value", dataSource, valueMember, true);
//OBJECT PROPERTY --> CONTROL VALUE
binding.Format += new ConvertEventHandler((sender, e) =>
{
Binding b = sender as Binding;
if (b != null)
{
DateTimePicker dtp = (binding.Control as DateTimePicker);
if (dtp != null)
{
if (e.Value == null)
{
dtp.ShowCheckBox = true;
dtp.Checked = false;
 
// have to set e.Value to SOMETHING, since it's coming in as NULL
// if i set to DateTime.Today, and that's DIFFERENT than the control's current
// value, then it triggers a CHANGE to the value, which CHECKS the box (not ok)
// the trick - set e.Value to whatever value the control currently has. 
// This does NOT cause a CHANGE, and the checkbox stays OFF.
 
e.Value = dtp.Value;
 
}
else
{
dtp.ShowCheckBox = true;
dtp.Checked = true;
// leave e.Value unchanged - it's not null, so the DTP is fine with it.
}
 
}
 
}
});
// CONTROL VALUE --> OBJECT PROPERTY
binding.Parse += new ConvertEventHandler((sender, e) => {
// e.value is the formatted value coming from the control. 
// we change it to be the value we want to stuff in the object.
Binding b = sender as Binding;
 
if (b != null)
{
DateTimePicker dtp = (b.Control as DateTimePicker);
if (dtp != null)
{
if (dtp.Checked == false)
{
dtp.ShowCheckBox = true;
dtp.Checked = false;
e.Value = (Nullable<DateTime>) null;
}
else
{
DateTime val = Convert.ToDateTime(e.Value);
e.Value =val;
}
}
}
});
dateTimePicker.DataBindings.Add(binding);
 
}