2013-09-08 4 views
8
<DataGrid Name="myfirstdg" Grid.Row="2" AutoGenerateColumns="False" CanUserSortColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" SelectionUnit="Cell" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Date" Binding="{Binding Path=date}" Width="SizeToCells" IsReadOnly="True" MinWidth="100"></DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

में DataGridTextColumn करने के लिए एक DatePicker जोड़ने के लिए मैं इसे में एक DataGridTextColumn के साथ एक सरल dategrid है। मैं अपने DataGridTextColumn में डेटपिकर कैसे जोड़ूं?कैसे WPF

+0

'डेटाग्रिड टेम्पलेट कॉलम' का उपयोग करें। – Nitesh

उत्तर

21

के रूप में नितेश ने कहा, का उपयोग DataGridTemplateColumn

<DataGridTemplateColumn Header="Pick a Date"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding myDate}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <DatePicker SelectedDate="{Binding myDate}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 
+0

यह डाटाग्रिड – SANDEEP

4

मैं अपने datagrids के हर कॉलम में एक DatePicker शब्दों में कहें, यहाँ मेरी सहायक विधि है कि मैं खिड़कियों निर्माता में DataGrid को सौंपते हैं। यह विधि जटिल ऑब्जेक्ट के लिए पीढ़ी को भी रद्द करती है जो डेटाग्रिड में शानदार नहीं दिखाई देगी।

अपनी इच्छा के अनुसार अनुकूलित करें!

public MainWindow() 
    { 
     InitializeComponent(); 
     myDataGrid.AutoGeneratingColumn += DataGridUtilities.dataGrid_AutoGeneratingColumn; 
    } 

public static class DataGridUtilities 
{ 
    public static void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
    { 
     if (!IsTypeOrNullableOfType(e.PropertyType, typeof (String)) && 
      !IsNullableOfValueType(e.PropertyType)) 
      e.Cancel = true; 
     else if (IsTypeOrNullableOfType(e.PropertyType, typeof (DateTime))) 
     { 
      DataGridTemplateColumn col = new DataGridTemplateColumn(); 
      col.Header = e.Column.Header; 
      FrameworkElementFactory datePickerFactoryElem = new FrameworkElementFactory(typeof (DatePicker)); 
      Binding dateBind= new Binding(e.PropertyName); 
      dateBind.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
      dateBind.Mode = BindingMode.TwoWay; 
      datePickerFactoryElem.SetValue(DatePicker.SelectedDateProperty, dateBind); 
      datePickerFactoryElem.SetValue(DatePicker.DisplayDateProperty, dateBind); 
      DataTemplate cellTemplate = new DataTemplate(); 
      cellTemplate.VisualTree = datePickerFactoryElem; 
      col.CellTemplate = cellTemplate; 
      e.Column = col;//Set the new generated column 
     } 
    } 


    private static bool IsTypeOrNullableOfType(Type propertyType, Type desiredType) 
    { 
     return (propertyType == desiredType || Nullable.GetUnderlyingType(propertyType) == desiredType); 
    } 

    private static bool IsNullableOfValueType(Type propertyType) 
    { 
     return (propertyType.IsValueType || 
       (Nullable.GetUnderlyingType(propertyType) != null && 
       Nullable.GetUnderlyingType(propertyType).IsValueType)); 
    } 
} 
1

यह @ Guish के उत्तर पर बनाता है लेकिन इसे एक नई कॉलम कक्षा में encapsulates।

private void Grid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyType == typeof(DateTime)) 
    { 
     e.Column = new DataGridDateTimeColumn((DataGridBoundColumn)e.Column); 
    } 
} 

internal class DataGridDateTimeColumn : DataGridBoundColumn 
{ 
    public DataGridDateTimeColumn(DataGridBoundColumn column) 
    { 
     Header = column.Header; 
     Binding = (Binding)column.Binding; 
    } 

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) 
    { 
     var control = new TextBlock(); 
     BindingOperations.SetBinding(control, TextBlock.TextProperty, Binding); 
     return control; 
    } 

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem) 
    { 
     var control = new DatePicker(); 
     BindingOperations.SetBinding(control, DatePicker.SelectedDateProperty, Binding); 
     BindingOperations.SetBinding(control, DatePicker.DisplayDateProperty, Binding); 
     return control; 
    } 
} 
+0

में डेटाटाइम पिकर नहीं दिखा रहा है शानदार जवाब, और यह वास्तव में महान बनाता है कि यह एक अत्यधिक पुन: प्रयोज्य रूप में है! यह तब भी अधिक मूल्यवान होगा यदि हम निर्दिष्ट कर सकते हैं कि "तिथि" - टेक्स्टब्लॉक में केवल एक भाग को प्रदर्शित करना है (इसे दिनांक तालिका फ़ील्ड के साथ आजमाया गया है और समय भी मिला है), या बेहतर अभी तक बाध्यकारी के स्ट्रिंगफॉर्मेट को सेट करने में सक्षम हो । –

+0

मैंने कुछ और भी देखा, यदि आप तिथि को संपादित और संपादित करते हैं, तो [Enter] कुंजी अब काम नहीं करती है (यह परिवर्तन नहीं करेगी), आप निश्चित रूप से किसी अन्य फ़ील्ड या पंक्ति पर ध्यान केंद्रित कर सकते हैं, लेकिन यह कुछ हद तक अजीब दिखता है उपयोगकर्ताओं। [टैब]/[बैकटाब] हालांकि काम करते हैं। –