如何遍历wpf网格并只选择选中的项目?

本文关键字:选择 项目 网格 何遍历 遍历 wpf | 更新日期: 2023-09-27 18:15:48

我有以下wpf数据网格:

<DataGrid x:Name="dataGridOrderItems" Margin="4,38,2,70"
VerticalGridLinesBrush="LightGray"  HorizontalGridLinesBrush="LightGray" AlternatingRowBackground="Beige"  AlternationCount="2" 
SelectionMode="Single" SelectionUnit="FullRow" 
AutoGenerateColumns="False" IsReadOnly="False" SelectionChanged="dataGridOrderItems_SelectionChanged">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Resource Id" Binding="{Binding ResourceId}" />
        <DataGridTextColumn Header="Resource Name" Binding="{Binding DisplayTitle}" />
        <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
        <DataGridTextColumn Header="Type" />
        <DataGridTextColumn Header="Location" />
        <DataGridTextColumn Header="Order Id" Binding="{Binding OrderId}" />
        <DataGridTextColumn Header="Order Date" Binding="{Binding OrderDate, StringFormat='{0:d'}}" />
        <DataGridTemplateColumn Header="Select" CellTemplate="{StaticResource template}"/>
    </DataGrid.Columns>
</DataGrid>

我一直在努力弄清楚如何迭代网格中的项目,并且只处理我通过使用cast和具有与列绑定匹配的属性的类所选择的项目。

我正在尝试使用以下内容进行迭代:

    foreach (
        var orderItem in
            this.dataGridOrderItems.ItemsSource.Cast<CustomerOrdersEntity>()
                .Where(item => item.IsChecked)
                .Where(item => item.DisplayTitle != null))
    {
        MessageBox.Show(orderItem.DisplayTitle);
    }

使用下面的类,我试图用于强制转换:

public class CustomerOrdersEntity
{
    public string ResourceId { get; set; }
    public string DisplayTitle { get; set; }
    public string Quantity { get; set; }
    public string OrderId { get; set; }
    private DateTime _orderDate;
    public DateTime OrderDate
    {
        get
        {
            return Convert.ToDateTime(this._orderDate, new CultureInfo("hr-HR")).Date;
        }
        set
        {
            this._orderDate = value.Date;
        }
    }
    public bool IsChecked { get; set; }
}

然而,我被告知这是一个无效的强制转换。

数据网格使用SqlCommand和使用Dataview集合的存储过程填充:

public DataView LoadOrders(int customerId, string status)
{
    using (var con = new SqlConnection(ConnectionString))
    {
        using (var cmd = new SqlCommand("RetreiveOrderSummaryByCustomerId", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar).Value = customerId;
            cmd.Parameters.Add("@Status", SqlDbType.VarChar).Value = status;
            using (var adapter = new SqlDataAdapter(cmd))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                con.Close();
                return dt.DefaultView;
            }
        }
    }
}

我正在使用上面的代码填充数据网格,并使用以下代码将其绑定为itemssource:

dataGridOrderItems.ItemsSource = data.LoadOrders(s, ComboBoxStatus.Text);

我想我可能在完全错误的方向上解决这个问题,我想知道在WPF数据网格中只迭代检查项的最佳方法是什么?

如何遍历wpf网格并只选择选中的项目?

您应该将DataGrid绑定到对象集合,而不是使用底层ItemsSource。一旦您这样做了,您所挣扎的任务将变得微不足道,因为您将能够迭代对象集合,并根据对象的Properties值执行任何类型的处理。