Skip to content

Commit bc82ba6

Browse files
authored
Merge pull request #2 from SyncfusionExamples/ES-975464
ES-975464 - Resolve the ReadMe file length issue in this sample repository
2 parents 683e5e4 + 89fdafb commit bc82ba6

File tree

1 file changed

+249
-0
lines changed

1 file changed

+249
-0
lines changed

README.md

Lines changed: 249 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,249 @@
1+
# How to Create a Custom Column from Existing Column in WPF / UWP DataGrid?
2+
3+
This repositories contains the samples to create custom column from existing columnm in [WPF DataGrid](https://www.syncfusion.com/wpf-controls/datagrid) and [UWP DataGrid](https://www.syncfusion.com/uwp-ui-controls/datagrid) (SfDataGrid).
4+
5+
You can create your own column by overriding the [predefined column types](https://help.syncfusion.com/wpf/datagrid/column-types#_Overriding_existing_cell) in DataGrid. For example, the **GridDateTimeColumn** loads the **DateTime** value by default. If you want to display **DateTimeOffset** value, you can create a new column by overriding the **GridDateTimeColumn** class.
6+
7+
In the below code snippet, converter created to format the **DateTimeOffSet** value to DateTime by defining **ValueBinding** (edit) and **DisplayBinding** (non-edit).
8+
9+
### For WPF:
10+
``` c#
11+
public class DateTimeOffsetFormatConverter : IValueConverter
12+
{
13+
private GridDateTimeOffsetColumn cachedColumn;
14+
15+
public DateTimeOffsetFormatConverter(GridDateTimeOffsetColumn column)
16+
{
17+
cachedColumn = column;
18+
}
19+
20+
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
21+
{
22+
value = ((DateTimeOffset)value).DateTime;
23+
var column = cachedColumn as GridDateTimeColumn;
24+
if (value == null || DBNull.Value == value)
25+
{
26+
if (column.AllowNullValue && column.MaxDateTime != System.DateTime.MaxValue && column.NullText == string.Empty)
27+
return column.MaxDateTime;
28+
29+
if (column.AllowNullValue && column.NullValue != null)
30+
return column.NullValue;
31+
else if (column.AllowNullValue && column.NullText != string.Empty)
32+
return column.NullText;
33+
34+
if (column.MaxDateTime != System.DateTime.MaxValue)
35+
return column.MaxDateTime;
36+
}
37+
38+
DateTime _columnValue;
39+
_columnValue = (DateTime)value;
40+
41+
if (_columnValue < column.MinDateTime)
42+
_columnValue = column.MinDateTime;
43+
44+
if (_columnValue > column.MaxDateTime)
45+
_columnValue = column.MaxDateTime;
46+
47+
return DateTimeFormatString(_columnValue, column);
48+
}
49+
50+
private string DateTimeFormatString(DateTime columnValue, GridDateTimeColumn column)
51+
{
52+
switch (column.Pattern)
53+
{
54+
case DateTimePattern.ShortDate:
55+
return columnValue.ToString("d", column.DateTimeFormat);
56+
case DateTimePattern.LongDate:
57+
return columnValue.ToString("D", column.DateTimeFormat);
58+
case DateTimePattern.LongTime:
59+
return columnValue.ToString("T", column.DateTimeFormat);
60+
case DateTimePattern.ShortTime:
61+
return columnValue.ToString("t", column.DateTimeFormat);
62+
case DateTimePattern.FullDateTime:
63+
return columnValue.ToString("F", column.DateTimeFormat);
64+
case DateTimePattern.RFC1123:
65+
return columnValue.ToString("R", column.DateTimeFormat);
66+
case DateTimePattern.SortableDateTime:
67+
return columnValue.ToString("s", column.DateTimeFormat);
68+
case DateTimePattern.UniversalSortableDateTime:
69+
return columnValue.ToString("u", column.DateTimeFormat);
70+
case DateTimePattern.YearMonth:
71+
return columnValue.ToString("Y", column.DateTimeFormat);
72+
case DateTimePattern.MonthDay:
73+
return columnValue.ToString("M", column.DateTimeFormat);
74+
case DateTimePattern.CustomPattern:
75+
return columnValue.ToString(column.CustomPattern, column.DateTimeFormat);
76+
default:
77+
return columnValue.ToString("MMMM", column.DateTimeFormat);
78+
}
79+
}
80+
81+
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
82+
{
83+
throw new NotImplementedException();
84+
}
85+
}
86+
87+
public class DateTimeOffsetToDateTimeConverter : IValueConverter
88+
{
89+
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
90+
{
91+
if (value == null)
92+
return null;
93+
return ((DateTimeOffset)value).DateTime;
94+
}
95+
96+
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
97+
{
98+
if (value == null)
99+
return null;
100+
return value is DateTimeOffset ? value : new DateTimeOffset((DateTime)value);
101+
}
102+
}
103+
```
104+
105+
In the below code snippet, **GridDateTimeOffsetColumn** column created from **GridDateTimeColumn**.
106+
107+
``` c#
108+
public class GridDateTimeOffsetColumn : GridDateTimeColumn
109+
{
110+
protected override void SetDisplayBindingConverter()
111+
{
112+
if ((DisplayBinding as Binding).Converter == null)
113+
(DisplayBinding as Binding).Converter = new DateTimeOffsetFormatConverter(this);
114+
115+
if ((ValueBinding as Binding).Converter == null)
116+
(ValueBinding as Binding).Converter = new DateTimeOffsetToDateTimeConverter();
117+
}
118+
}
119+
```
120+
121+
In the below code snippet, created **GridDateTimeOffsetColumn** added to [SfDataGrid.Columns](https://help.syncfusion.com/cr/wpf/Syncfusion.UI.Xaml.Grid.SfDataGrid.html#Syncfusion_UI_Xaml_Grid_SfDataGrid_Columns) collection and specify the Pattern as FullDateTime. Since the **ShortDate** is the default pattern of **GridDateTimeColumn**.
122+
123+
#### XAML
124+
125+
``` xml
126+
<syncfusion:SfDataGrid x:Name="dataGrid"
127+
AutoGenerateColumns="False"
128+
ItemsSource="{Binding Orders}">
129+
<syncfusion:SfDataGrid.Columns>
130+
<local:GridDateTimeOffsetColumn MappingName="OrderDate" Pattern="FullDateTime" UseBindingValue="True"/>
131+
</syncfusion:SfDataGrid.Columns>
132+
</syncfusion:SfDataGrid>
133+
```
134+
135+
#### C#
136+
137+
``` c#
138+
this.datagrid1.Columns.Add(new GridDateTimeOffsetColumn()
139+
{
140+
MappingName = "OrderDate",
141+
Pattern = Syncfusion.Windows.Shared.DateTimePattern.FullDateTime,
142+
UseBindingValue = true
143+
});
144+
```
145+
146+
### For UWP:
147+
148+
``` csharp
149+
public class DateTimeOffsetFormatConverter : IValueConverter
150+
{
151+
private GridDateTimeOffsetColumn cachedColumn;
152+
153+
public DateTimeOffsetFormatConverter(GridDateTimeOffsetColumn column)
154+
{
155+
cachedColumn = column;
156+
}
157+
158+
object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
159+
{
160+
value = ((DateTimeOffset)value).DateTime;
161+
var column = cachedColumn as GridDateTimeColumn;
162+
163+
if (value == null || DBNull.Value == value)
164+
{
165+
if (column.AllowNullValue && column.MaxDate != System.DateTime.MaxValue && column.WaterMark == string.Empty)
166+
return column.MaxDate;
167+
168+
if (column.AllowNullValue && column.WaterMark != string.Empty)
169+
return column.WaterMark;
170+
171+
if (column.MaxDate != System.DateTime.MaxValue)
172+
return column.MaxDate;
173+
}
174+
175+
DateTime _columnValue;
176+
_columnValue = (DateTime)value;
177+
178+
if (_columnValue < column.MinDate)
179+
_columnValue = column.MinDate;
180+
181+
if (_columnValue > column.MaxDate)
182+
_columnValue = column.MaxDate;
183+
184+
return _columnValue.ToString(column.FormatString, CultureInfo.CurrentUICulture);
185+
}
186+
187+
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
188+
{
189+
throw new NotImplementedException();
190+
}
191+
}
192+
193+
public class DateTimeOffsetToDateTimeConverter : IValueConverter
194+
{
195+
object IValueConverter.Convert(object value, Type targetType, object parameter, string language)
196+
{
197+
if (value == null)
198+
return null;
199+
return ((DateTimeOffset)value).DateTime;
200+
}
201+
202+
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language)
203+
{
204+
if (value == null)
205+
return null;
206+
return value is DateTimeOffset ? value : new DateTimeOffset((DateTime)value);
207+
}
208+
}
209+
```
210+
211+
In the below code snippet, **GridDateTimeOffsetColumn** column created from **GridDateTimeColumn**.
212+
213+
``` csharp
214+
public class GridDateTimeOffsetColumn:GridDateTimeColumn
215+
{
216+
protected override void SetDisplayBindingConverter()
217+
{
218+
if ((DisplayBinding as Binding).Converter == null)
219+
(DisplayBinding as Binding).Converter = new DateTimeOffsetFormatConverter(this);
220+
221+
if ((ValueBinding as Binding).Converter == null)
222+
(ValueBinding as Binding).Converter = new DateTimeOffsetToDateTimeConverter();
223+
}
224+
}
225+
```
226+
227+
In the below code snippet, created **GridDateTimeOffsetColumn** added to **SfDataGrid.Columns** collection and specify the full date-time pattern in **FormatString** as **F**. Since the **ShortDate** is the default pattern of **GridDateTimeColumn**.
228+
229+
#### XAML
230+
231+
``` xml
232+
<syncfusion:SfDataGrid x:Name="dataGrid"
233+
AutoGenerateColumns="False"
234+
ItemsSource="{Binding Orders}">
235+
<syncfusion:SfDataGrid.Columns>
236+
<local:GridDateTimeOffsetColumn FormatString="F"
237+
HeaderText="Order Date"
238+
MappingName="OrderDate"
239+
AllowInlineEditing="True"
240+
UseBindingValue="True"/>
241+
</syncfusion:SfDataGrid.Columns>
242+
</syncfusion:SfDataGrid>
243+
```
244+
245+
#### C#
246+
247+
``` csharp
248+
this.dataGrid.Columns.Add(new GridDateTimeOffsetColumn() { HeaderText = "Order Date", MappingName = "OrderDate", FormatString = "F" , AllowInlineEditing = true, UseBindingValue = true });
249+
```

0 commit comments

Comments
 (0)