【问题标题】:c# how correctly edit objects with DataGridc# 如何使用 DataGrid 正确编辑对象
【发布时间】:2017-02-11 17:45:18
【问题描述】:

我一直在为 DataGrid 苦苦挣扎。

我需要从 SQL 读取数据并将它们填充到表中,并可以对其进行编辑(不需要将更改上传回数据库)。然后根据表格,生成报表。

我以前从未使用过 DataGrid,而且我对 WPF 概念也很陌生,但这里有两种我尝试过的方法。

第一个: dataGridItems.ItemsSource = previewItems; 其中previewItemsItem 对象的列表。

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 单元格时应用程序就会崩溃。即使我设置了IsReadOnly="True",这也是我无法理解的。

我花了几个小时寻找解决方案 - 找到了一些,但要么我不明白,要么他们没有工作。

感谢您的帮助

【问题讨论】:

    标签: c# wpf dynamic-columns


    【解决方案1】:

    [...] 根据当前可见的数据动态调整大小

    您可以随意设置列的样式。假设 dt 是你的 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>
    

    【讨论】:

    • 谢谢它的工作。我可以为特定列定义列大小吗?现在它设置了数据网格中的所有列。
    • 检查 e.Column.Headere.Column.DisplayIndex 或任何其他信息,如果您不想更改任何内容, 只需使用 return。
    猜你喜欢
    • 2017-07-16
    • 2019-01-11
    • 2020-12-14
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多