【问题标题】:new row in datagrid with custom data带有自定义数据的数据网格中的新行
【发布时间】:2022-09-28 15:49:37
【问题描述】:

我有两个数据网格。第一个是关于时间跟踪的概述。第二个显示了一些细节。

例如: 第一个数据网格包含员工工作的每一天。第二个数据网格包含一天的时间戳。

但是,当我添加新的冲压行时,数据网格中的控件为空。这不是一个真正的问题,但日期选择器显示日期 01/01/0001。

我想要的是当我添加一个新行时,日期字段应该填充第一个数据网格中的日期。

看法:

 <DataGrid Grid.Column=\"0\"
                          IsReadOnly=\"True\"
                          AutoGenerateColumns=\"False\"
                          Grid.Row=\"0\"
                          x:Name=\"DgStundenView\"
                          Margin=\"0 0 10 0\"
                          SelectedItem=\"{Binding SelectedItem}\"
                          ItemsSource=\"{Binding TimeOverviewList}\">
                <DataGrid.Columns>
                    <DataGridTextColumn Header=\"Wochentag\" Binding=\"{Binding Wochentag}\" />
                    <DataGridTextColumn Header=\"Datum\" Binding=\"{Binding Tag}\" />
                    <DataGridTextColumn Header=\"Arbeitszeit Soll\" Binding=\"{Binding ArbeitszeitInStunden}\" />
                    <DataGridTextColumn Header=\"Arbeitszeit gesamt\" Binding=\"{Binding GesamtDauerInStunden}\" />
                    <DataGridTextColumn Header=\"Pausenzeit\" Binding=\"{Binding Pausenzeit}\" />
                    <DataGridTextColumn Header=\"Pausendifferenz\" Binding=\"{Binding PausenDifferenzInStunden}\" />
                    <DataGridTextColumn Header=\"Arbeitszeit inkl. Pause\" Binding=\"{Binding TatsaechlicheDauerInStunden}\" />
                    <DataGridCheckBoxColumn Header=\"Status\" Binding=\"{Binding StempelungVorhanden,Mode=OneWay}\" />
                    <DataGridTextColumn Header=\"Info\" Binding=\"{Binding Info}\" />
                </DataGrid.Columns>

                <DataGrid.RowStyle>
                    <Style TargetType=\"DataGridRow\">
                        <Style.Triggers>
                            <DataTrigger Binding=\"{Binding Wochentag}\" Value=\"Sa\">
                                <Setter Property=\"Background\" Value=\"LightGray\" />
                            </DataTrigger>
                            <DataTrigger Binding=\"{Binding Wochentag}\" Value=\"So\">
                                <Setter Property=\"Background\" Value=\"LightGray\" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.RowStyle>
            </DataGrid>

            <DataGrid Grid.Column=\"0\"
                      Grid.Row=\"1\"
                          x:Name=\"DgStempelungen\"
                          Margin=\"0 10 10 0\"
                          AutoGenerateColumns=\"False\"
                      CanUserAddRows=\"True\"
                      SelectedItem=\"{Binding SelectedValue}\"
                      ItemsSource=\"{Binding TimeDetailList}\">


                <DataGrid.Resources>
                    <x:Array x:Key=\"Reasons\" Type=\"system:String\">
                        <system:String>NICHT ANWENDBAR</system:String>
                        <system:String>KRANK</system:String>
                        <system:String>GANZER TAG URLAUB</system:String>
                    </x:Array>
                </DataGrid.Resources>

                <DataGrid.Columns>

                    <DataGridTextColumn Header=\"ID\" IsReadOnly=\"True\" Binding=\"{Binding  Id}\"/>
                    <DataGridTemplateColumn Header=\"KOMMEN DATUM\">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker SelectedDate=\"{Binding  ComeBooking}\"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header=\"KOMMEN UHRZEIT\">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <materialDesign:TimePicker Text=\"{Binding ComeBookingTime, StringFormat=t}\"
                                                           Is24Hours=\"True\">
                                </materialDesign:TimePicker>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header=\"GEHEN DATUM\">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker SelectedDate=\"{Binding GoBooking}\"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header=\"GEHEN UHRZEIT\">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <materialDesign:TimePicker Text=\"{Binding GoBookingTime, StringFormat=t}\"
                                                           Is24Hours=\"True\">
                                </materialDesign:TimePicker>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridComboBoxColumn Header=\"GRUND\"
                                            ItemsSource=\"{StaticResource Reasons}\"
                                            TextBinding=\"{Binding Info}\"/>

查看模型

   [CanBeNull] private ClassTimeTrackingDayStamp _selectedItem;

        [CanBeNull]
        public ClassTimeTrackingDayStamp SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                OnPropertyChanged();
                if (_selectedItem != null)
                    TimeDetailList = new ObservableCollection<ClassTimeTrackingTimeStamp>(_selectedItem.Stempelungen);
            }
        }

        private ObservableCollection<ClassTimeTrackingDayStamp> _timeOverviewList;

        public ObservableCollection<ClassTimeTrackingDayStamp> TimeOverviewList
        {
            get { return _timeOverviewList; }
            set
            {
                _timeOverviewList = value;
                OnPropertyChanged();
            }
        }

        [CanBeNull] private ObservableCollection<ClassTimeTrackingTimeStamp> _timeDetailList;

        [CanBeNull]
        public ObservableCollection<ClassTimeTrackingTimeStamp> TimeDetailList
        {
            get { return _timeDetailList; }
            set
            {
                _timeDetailList = value;
                OnPropertyChanged();
            }
        }

模型

   public class ClassTimeTrackingTimeStamp : ViewModelBase
    {
        public DateTime ComeBooking { get; set; }

        public DateTime GoBooking { get; set; }

        public TimeSpan ComeBookingTime { get; set; }
        public TimeSpan GoBookingTime { get; set; }

        public int Id { get; set; }

        public string Info { get; set; }
    }

谢谢您的帮助 :)

此致 莱文

  • 您的意思是当用户将新行添加到第二个 DataGrid 时您想要默认值?

标签: c# wpf datagrid


【解决方案1】:

在第二个 DataGrid 中,您可以订阅AddingNewItem 事件

<DataGrid x:Name="DgStempelungen" 
          AddingNewItem="DgStempelungen_OnAddingNewItem"
          ...

在后面的代码中

private void DgStempelungen_OnAddingNewItem(object sender, AddingNewItemEventArgs e)
{
    // I'll assume that the Model's Name in first DataGrid collection is StudentItem!
    var selectedItemInFirstDg = DgStundenView.SelectedItem as StudentItem; 
    // hold the new empty row
    var newItem = e.NewItem as ClassTimeTrackingDayStamp;
    if (selectedItemInFirstDg != null && newItem != null){
       // fill the new row with data from selectedItemInFirstDg, ex. date, etc...
       // newItem.ComeBooking = selectedItemInFirstDg.Date; // for example
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    相关资源
    最近更新 更多