views:

340

answers:

1

hi folks, I have a DataGridView bound to a table from a .sdf database through a BindSource. The date column display dates like "d/M/yyyy HH:mm:ss". e.: "27/2/1971 00:00:00".

I want to make it display just "27/02/1971" in its place. I tried to apply DataGridViewCellStyle {format=dd/MM/yyyy} but nothing happens, event with other pre-built formats.

On the the other side, there's a Form with a MasketTextBox with a "dd/MM/yyyy" mask to its input that is bound to the same column and uses a Parse and a Format event handler before display and send it to the db.

Binding dataNascimentoBinding = new Binding("Text", this.source, "Nascimento", true);
dataNascimentoBinding.Format += new ConvertEventHandler(Util.formatDateConvertEventHandler);
dataNascimentoBinding.Parse += new ConvertEventHandler(Util.parseDateConvertEventHandler);
this.dataNascimentoTxt.DataBindings.Add(dataNascimentoBinding);


    public static string convertDateString2DateString(string dateString, string inputFormat, string outputFormat )
    {
        DateTime date = DateTime.ParseExact(dateString, inputFormat, DateTimeFormatInfo.InvariantInfo);
        return String.Format("{0:" + outputFormat + "}", date);
    }

    public static void formatDateConvertEventHandler(object sender, ConvertEventArgs e)
    {
        if (e.DesiredType != typeof(string)) return;
        if (e.Value.GetType() != typeof(string)) return;

        String dateString = (string)e.Value;
        e.Value = convertDateString2DateString(dateString, "d/M/yyyy HH:mm:ss", "dd/MM/yyyy");
    }

    public static void parseDateConvertEventHandler(object sender, ConvertEventArgs e)
    {
        if (e.DesiredType != typeof(string)) return;
        if (e.Value.GetType() != typeof(string)) return;

        string value = (string)e.Value;

        try
        {
            e.Value = DateTime.ParseExact(value, "dd/MM/yyyy", DateTimeFormatInfo.InvariantInfo);
        }
        catch
        {
            return;
        }
    }

Like you can see by the code it was expexted that Date coming from SQL would be a DateTime value as is its column, but my eventHandler is receiving a string instead. Likewise, the result date for parse should be a datetime but its a string also.

I'm puzzled dealing with this datetime column.

A: 

Found the problem. The column type must be set in the DataSet view to the type you want in your application. So if you just change it to DateTime with a Parse and Format method you are safe even if the user changes the PC locale.

After doing it the format in DataGridView starts to work.

Ruben Trancoso