Как прочитать строки DataGridTemplateColumn с текстовыми полями сетки данных в WPF и сохранить значения в таблице базы данных - PullRequest
0 голосов
/ 11 марта 2020
<DataGrid  AutoGenerateColumns="False"  x:Name="McDataGrid" x:FieldModifier="public"  Background="#FFDAC7C7">
    <DataGrid.ItemContainerStyle>
         <Style TargetType="{x:Type DataGridRow}"></Style>
    </DataGrid.ItemContainerStyle>
    <DataGrid.Columns>
         <DataGridTextColumn Header="Room Types" Binding="{Binding RoomType}" MinWidth="150"/>
         <DataGridTemplateColumn Header="AP Rate" MinWidth="80">
              <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                         <TextBox x:Name="AP_Rate"  
                   Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="15"   Height="40"  TextWrapping="Wrap"  VerticalAlignment="Top" MinWidth="60"/>

                    </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>

          <DataGridTemplateColumn Header="MAP Rate" MinWidth="80">
               <DataGridTemplateColumn.CellTemplate>
                     <DataTemplate>
                           <TextBox x:Name="MAP_Rate"  
                   Style="{StaticResource MaterialDesignFloatingHintTextBox}" FontSize="15"  Height="40"  TextWrapping="Wrap"  VerticalAlignment="Top" MinWidth="60"/>
                     </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>                        
    </DataGrid.Columns>
</DataGrid>

Код позади

var _RoomTypeIdlist = db._RoomTypes.Select(s => new
{
    RoomType = s.Name,
    rtyid = s._RoomTypeId
}).ToList();
McDataGrid.ItemsSource = _RoomTypeIdlist;

Скриншот DataGrid

Теперь я хочу прочитать все скорости строк текстового поля и соответственно сохраните данные, т.е. когда я нажму кнопку «ДОБАВИТЬ», ставки должны быть добавлены в четыре строки другой таблицы. Например, (см. Изображение)

1 Ответ

0 голосов
/ 11 марта 2020

Хотя можно получить данные из DataTemplateColumn , это не самый простой и надежный способ получить то, что вы хотите.

Итак, насколько я понимаю, у вас есть что-то например, как ваш DbContext

public class RoomType
{
    [Key]   
    int _RoomTypeId { get; set; }
    string Name { get; set; }
}

public class RoomData
{
    [Key]
    int Id { get; set; }
    RoomType RoomType { get; set; }
    int ApRate { get; set; }
    int MapRate { get; set; }
}

public class RoomsDbContext : DbContext
{
    public DbSet<RoomType> _RoomTypes {get;}
    public DbSet<RoomData> _RoomDatas {get;}
}

Тогда в своем коде вы можете установить для свойства DataSrid DataSrid значение

var newRoomDataList = db
    ._RoomTypes
    .Select(s =>
        new RoomData
        {
            RoomType = s
        })
    .ToList();
McDataGrid.ItemsSource = newRoomDataList;

И просто привязать RoomData свойства непосредственно в представлении

<DataGrid.Columns>
    <DataGridTextColumn Header="Room Types" Binding="{Binding RoomType.Name}"/>
    <DataGridTemplateColumn Header="AP Rate" >
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBox x:Name="AP_Rate"  Binding="{Binding ApRate}"/>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>

Тогда в обработчике события OnClick кнопки Add вы можете просто

public void OnAddDataClick(object sender, RoutedEventArgs e)
{
    var newRoomDataList = (IEnumerable<RoomData>)((DataGrid)sender).DataSource;
    db._RoomDatas.AddRange(newRoomDataList);
    db.SaveChanges();
}

PS: хотя это должно работать (за исключением некоторых незначительных опечаток и упущений), это не лучший подход. Как только вы разберетесь с WPF, я рекомендую вам начать чтение по шаблону MVVM .

PS2: Кроме того, я рекомендую вам немного прочитать о наименованиях C# , поскольку текущее наименование немного необычно, и может быть лучше рассмотреть возможность использования более стандартной схемы именования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...