如何遍历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数据网格中只迭代检查项的最佳方法是什么?
您应该将DataGrid
绑定到对象集合,而不是使用底层ItemsSource
。一旦您这样做了,您所挣扎的任务将变得微不足道,因为您将能够迭代对象集合,并根据对象的Properties值执行任何类型的处理。