none
C# - Копирование (клонирование) столбца DataTable RRS feed

  • Общие обсуждения

  • С# : WPF : DataGrid : DataTable

    Здарова!

    Есть исходный столбец DataTable и в нем содержатся данные в виде:

    http://i.gyazo.com/01d8c50dd6a1457f64f002e65281ddbd.png

    8/29/14 8:04:44 PM

    Т.е. в одном столбце содержатся и дата и время, и всё это в неудобно читаемом формате.

    Необходимо добавить в DataTable еще 1 такой же столбец (копию), как и исходный, но с преобразованием нового и исходного столбца в удобно читаемую дату или время (примерный формат 10.10.14 ; 21:03:58). Т.е. на выходе должно быть 2 столбца (исходный и новый), следующего вида:

    Исходный Новый

    22.10.14 22:22:01

    или

    Исходный  Новый

    22:22:01 22.10.14

    Не подскажите как быть? 

    Может есть настройки DataTable по приведению к стандартному виду дата/времени или формат вывода строк..

    Пытался так: 

    dt.Columns.Add("time", System.Type.GetType("System.DateTime"), String.Format("{0:HH:MM:ss}", dt.Columns["datatime"].ToString());

    Но так не канает :) Есть какое-либо подобное элегантное решение? Желательно без цикла по всем строкам 2 столбцов, т.к. кол-во строк велико и хотелось бы преобразование делать "на лету" ) Лямбда-выражения не предлагать, в них не силен, но разве кому-то если только очень сильно захочется :))

    Форматировать  данные при привязке к столбцу DataGrid (типа "Binding Path=.., String.Format"), тоже не хорошее решение. Т.к. при копировании содержимого ячейки грида Ctrl+C, копируется и скрытое значение, что не правильно.

    10 октября 2014 г. 22:08

Все ответы

  • Можно добавить второй столбец, задав ему свойство Expression. Допустим, первый столбец называется firstColumn, а второй - secondColumn.

    secondColumn.Expression = "firstColumn";

    В результате во втором столбце будут те же значения, что и в первом.

    А дальше нужно задать выводимый формат в DataGrid'е, отдельно для каждого столбца.

    11 октября 2014 г. 6:35
  • Petalvik, спасибо за помощь, но решение немного не подходит. Я изначально настраивал формат вывода для каждого столбца в DataGrid, но столкнулся с проблемой при копировании значения ячейки DataGrid. Копируется не только выводимый формат, но и скрытое, отфильтрованное значение. 

    Т.е. если даже и задавать {0:HH:MM:ss}, то скопируется и время и дата.

    Поэтому необходима механическая работа по преобразованию.. Т.е. хочу отделить мух от котлет. Вот и ищу способ как это сделать. 

    11 октября 2014 г. 10:03
  • а что вам мешает сделать запрос программным путем если вы используете  sqlserver используйте функцию к примеру  convert(date," &     DateTimePicker1.Value.ToString("yyyy.MM.dd") & ")) тогда данные будут отображаться в виде 2014,04,15
    12 октября 2014 г. 8:10
  • Проблему решил, написав конвертер, который привязывается к столбцу DataGrid.

    xmlns:src="clr-namespace:WPF_App.Classes"
    
    <Window.Resources>
            <src:DateConverter x:Key="date_converter"/>
            <src:TimeConverter x:Key="time_converter"/> 
    </Window.Resources>
    
    <DataGridTextColumn Header="Дата" Binding="{Binding Path=data, Converter={StaticResource date_converter}}"/>
    <DataGridTextColumn Header="Время" Binding="{Binding Path=time, Converter={StaticResource time_converter}}" />
     class DateConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is DateTime)
                {
                    return ((DateTime)value).ToString("dd.MM.yy");
                }
                else
                {
                    return "Non dates";
                }
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new Exception("The method or operation is not implemented.");
            }
        }
    
       class TimeConverter : IValueConverter
       {
           public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
           {
               if (value is DateTime)
               {
                   return ((DateTime)value).ToString("HH:mm:ss");
               }
               else
               {
                   return "Non time";
               }
           }
    
           public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
           {
               throw new Exception("The method or operation is not implemented.");
           }
       }

    При клонировании столбца использовал Expression.

    Даже не знаю кому правильный ответ зачислить. В первом ответе - помогли с копированием, во втором - дали мысль про функцию convert.

    [РЕШЕНО]

    7 ноября 2014 г. 7:48