2017-02-11 2 views
0

Я борюсь с DataGrid.C# как правильно редактировать объекты с помощью DataGrid

Мне нужно прочитать данные из SQL и заполнить их в таблицу, с возможностью их редактирования (не требуется загружать изменения обратно в DB). Затем, основываясь на таблице, я создам отчет.

Я никогда раньше не работал с DataGrid, и я также новичок в концепциях WPF, но вот два подхода, которые я пробовал.

Первый:dataGridItems.ItemsSource = previewItems; где previewItems находится список Item объектов.

public class Item 
{ 
    public string ItemName { get; set; } 
    public string ItemCode { get; set; } 
    public decimal ItemPrice { get; set; } 
    public Item(string itemName, string itemCode, decimal itemPrice = 0) 
    { 
     this.ItemName = itemName; 
     this.ItemCode = itemCode; 
     this.ItemPrice = itemPrice; 
    } 
} 

Я могу читать/писать данные - как я бы хотел. Проблема с этим решением - это размер столбца, который динамически изменяется на основе данных, которые в настоящее время видны.

Второй: Переплет в XAML.

<DataGrid x:Name="dataGridItems" IsReadOnly="True" SelectionMode="Single" HorizontalAlignment="Left" Margin="691,10,0,0" Grid.Row="2" VerticalAlignment="Top" Height="628" Width="791" MinWidth="260" MouseDoubleClick="dataGridItems_MouseDoubleClick"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Kód" MinWidth="60" Width="10*" Binding="{Binding Path=ItemCode}"/> 
      <DataGridTextColumn Header="Název výkonu" MinWidth="200" Width="90*" Binding="{Binding Path=ItemName}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

Затем в цикле, я добавлял элементы

DataGridCustomer.Items.Add(customer);

Это работает для меня, пока я обнаружил, что приложение сбой каждый раз, когда я дважды щелкните на DataGrid cell.Even, если я изложу IsReadOnly="True", что-то вроде того, что я не недооцениваю.

Я потратил несколько часов, чтобы найти разрешение - нашел некоторых, но либо я не недооценил, либо они не работали.

Спасибо за помощь

ответ

0

[...], которая динамически Отмасштабированная на основе данных, которые в настоящее время видны

Вы можете стиль колонки, как вам нравится. Предполагая дт Ваш DataGrid, обрабатывать AutoGeneratingColumn событие:

 dt.AutoGeneratingColumn += Dt_AutoGeneratingColumn; 
//.... 
private void Dt_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    DataGridColumn col = e.Column; 
    // you can set the maximum width of the column: 
    col.MaxWidth = 200.0; 
    // or you can define a element style, for text wrapping, etc. 
    col.CellStyle = (Style)FindResource("cellStyle"); 
    } 

, в котором стиль объявлен в App.xaml. Что-то вроде этого:

<Application.Resources> 
    <Style x:Key="cellStle"> 
     <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 
    </Style> 
</Application.Resources> 
+0

Спасибо, что работает. Могу ли я определить размер колонок для определенного столбца? Теперь он устанавливает все столбцы в datagrid. – Izmail360

+0

Проверьте _e.Column.Header_ или _e.Column.DisplayIndex_ или любую другую информацию, и если вы не хотите ничего менять, просто используйте return. – Ron

Смежные вопросы