我有一个要求是使用WPF C#在datagrid中的“listview”或“datagrid”中绑定其他列。
基本数据网格我有如下
xcopy C:\Users\t\Desktop\survival\world "C:\Users\t\Desktop\backups\survival\Backup-%date:/=-%_%time:~0,2%.%time:~3,2% /s /e /i
对于上述<table border="1" width="100%">
<tr>
<td>Item Id</td>
<td>Item Name</td>
<td>Quantity</td>
<td>Price</td>
</tr>
<tr>
<td>500</td>
<td>Sanwich</td>
<td>2</td>
<td>10</td>
</tr>
</table>
我的datagrid
代码,如下所示。
XAML
我在代码后面的代码如下按钮点击事件:
<DataGrid Grid.Column="1" Margin="8,60,8,16"AutoGenerateColumns="False" Height="350"
HorizontalAlignment="Left" Name="gridOrderDetails" VerticalAlignment="Top" Width="450" >
<DataGrid.Columns>
<DataGridTextColumn Header="Item ID" Binding="{Binding itemId}" />
<DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" />
<DataGridTextColumn Header="Item Name" Binding="{Binding comments}" />
<DataGridTextColumn Header="Item Price" Binding="{Binding ItemPrice}" />
</DataGrid.Columns>
</DataGrid>
我想要的输出如下
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
DBDataContext dbContext = new DBDataContext();
SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
gridOrderDetails.ItemsSource = dbContext.SP_Get_ItemList(orderRow.orderid);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
return;
}
}
要实现此目标<table border="1" width="100%">
<tr>
<td>Item Id</td>
<td>Item Name</td>
<td>Additionals</td>
<td>Quantity</td>
<td>Price</td>
</tr>
<tr>
<td>500</td>
<td>Sanwich</td>
<td>Egg<p class="MsoNormal" style="margin-left:0in">Ketchup</p>
<p>
<span style="font-size: 11.0pt; line-height: 115%; font-family: Calibri,sans-serif">
Salad</span></td>
<td>2</td>
<td>10</td>
</tr>
</table>
,我使用datagrid
编写了我的XAML
代码,如下所示。
DataGridTemplateColumn
在后面的代码中,我尝试使用<DataGrid Grid.Column="1" Margin="8,60,8,16"AutoGenerateColumns="False" Height="350"
HorizontalAlignment="Left" Name="gridOrderDetails" VerticalAlignment="Top" Width="450" LoadingRow="gridOrderDetails_LoadingRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Item ID" Binding="{Binding itemId}" />
<DataGridTextColumn Header="Item Name" Binding="{Binding ItemName}" />
<DataGridTemplateColumn Header="Addtionals">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DataGrid AutoGenerateColumns="False" Name="gridAdditionals" >
<DataGridTextColumn Header="Additional" Binding="Additionals"></DataGridTextColumn>
</DataGrid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" />
<DataGridTextColumn Header="Comments" Binding="{Binding comments}" />
<DataGridTextColumn Header="Item Price" Binding="{Binding ItemPrice}" />
</DataGrid.Columns>
</DataGrid>
事件,但无法从单元格值传递相应的LoadingRow
。
ItemID
我想我使用的逻辑是错误的。这可以使用Asp.net C#中的private void gridOrderDetails_LoadingRow(object sender, DataGridRowEventArgs e)
{
DCAPPDBDataContext dbContext = new DCAPPDBDataContext();
DataGrid grid = FindChild<DataGrid>(gridOrderDetails, "gridAdditionals");
grid.ItemsSource = dbContext.SP_Get_AdditionalsList(500);
}
来实现。
任何人都可以帮我解决如何在WPF C#中执行此操作。
答案 0 :(得分:1)
使用WPF
时,它适合遵循MVVM
模式。无论哪种方式,您都应该为Order
定义一个合适的类(即视图模型)(包含Id,Name,Quantity等属性...)。此类还应具有Aditionals
的属性(例如strings
的集合)。然后,通过使用正确的DataBindings
,您将实现所需的功能。
这是一个给你一个想法的工作示例:
订单类:
public class Order : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
public Order(int id)
{
DBDataContext dbContext = new DBDataContext();
DCAPPDBDataContext dbContext2 = new DCAPPDBDataContext();
var itemsSource = dbContext.SP_Get_ItemList(id);
var additionals = dbContext2.SP_Get_AdditionalsList(id);
Id = id;
Name = itemsSource.name;
Quantity = itemsSource.quantity;
// other properties ...
Additionals = new ObservableCollection<string>();
foreach (var item in additionals)
{
Additionals.Add(item);
}
}
private int _id;
public int Id
{
get
{
return _id;
}
set
{
_id = value;
OnPropertyChanged("Id");
}
}
// define other properties e.g. Name, Quantity, Price, etc.
// the same way as Id.
public ObservableCollection<string> Additionals {get;set;}
}
<强>的Xaml:强>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" AutoGenerateColumns="False"
ItemsSource="{Binding Orders}"
SelectedItem="{Binding SelectedOrder}">
<DataGrid.Columns>
<DataGridTextColumn Header="Item ID" Binding="{Binding Id}" />
<DataGridTextColumn Header="Item Name" Binding="{Binding Name}" />
<DataGridTemplateColumn Header="Addtionals">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding Additionals}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" />
<DataGridTextColumn Header="Item Price" Binding="{Binding Price}" />
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Content="New Order" Click="Order_Click"/>
</Grid>
<强> MainWindow.cs:强>
public ObservableCollection<Order> Orders { get; set; }
public Order SelectedOrder { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Orders = new ObservableCollection<Order>();
}
private void Order_Click(object sender, RoutedEventArgs e)
{
SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
Orders.Add(new Order(orderRow.orderid));
}
答案 1 :(得分:1)
在Bahman_Aries帖子的帮助下,我发布了一些确切的解决方案。 这是我想要的精确解决方案。
订单类:
public class Order : INotifyPropertyChanged
{
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
public Order(SP_Get_ItemListResult itemResult)
{
DBDataContext dbContext = new DBDataContext();
orderItemID = itemResult.orderItemID;
itemName = itemResult.ItemName;
quantity = itemResult.quantity;
// other properties ...
var additionals = dbContext.SP_Get_AdditionalsList(orderItemID);
Additionals = new ObservableCollection<string>();
foreach (var item in additionals)
{
Additionals.Add(item.Additionals);
}
}
private int _id;
public int Id
{
get
{
return _id;
}
set
{
_id = value;
OnPropertyChanged("Id");
}
}
// define other properties e.g. Name, Quantity, Price, etc.
// the same way as Id.
public ObservableCollection<string> Additionals {get;set;}
}
XAML代码没有变化。
<强> MainWindow.cs:强>
public ObservableCollection<Order> Orders { get; set; }
public Order SelectedOrder { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
Orders = new ObservableCollection<Order>();
}
private void Order_Click(object sender, RoutedEventArgs e)
{
SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
List<SP_Get_ItemListResult> itemsSource = dbContext.SP_Get_ItemList(orderRow.orderid).ToList();
for (int i = 0; i < itemsSource.Count(); i++)
{
Orders.Add(new Order(itemsSource[i]));
}
}