DataGrid 内嵌ComboBox动态数据联动
在DataGrid的单元格中嵌入ComboBox是十分常见且是经常使用的一个操作。在上一篇中,我为大家介绍了如何使用静态资源绑定作为ComboBox的数据源。然而,在实际开发的过程中,我们经常会碰到处理动态数据的问题。本文将为大家介绍如何动态绑定DataGrid中ComboBox的数据源。
准备工作 1)测试项目的建立 请参考我的Silverlight-a-powerful-DataGrid-component-2-data-exchange-of-the-ADO.NET-Entity-Framework">强大的DataGrid组件[2]_数据交互之ADO.NET Entity Framework——Silverlight学习笔记[10]。 2)创建测试用数据库 为了实现数据联动,我们需要在测试数据库Employees中创建如下的两张数据表。(使用SQL Server">SQL Server Express创建) 两表的字段属性: [Employee]
具体步骤参照我的强大的DataGrid组件[3]_数据交互之Linq to SQL——Silverlight学习笔记[11]。 下面是EmployeeModel.dbml图
具体步骤参照我的强大的DataGrid组件[3]_数据交互之Linq to SQL——Silverlight学习笔记[11]。 我们需要建立如下的两个Silverlight-enabled WCF Web Service。 EmployeesInfoSevice.svc.cs代码如下: using System; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.Collections.Generic; using System.Text; using EmployeesContext;//引入数据库实体所在命名空间 using EmployeesEntities;//引入数据表实体所在命名空间
namespace DataGridnComboBox { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class EmployeesInfoSevice { [OperationContract] public List<Departments> GetEmployeesDepartment() { EmployeeModelDataContext db = new EmployeeModelDataContext(); return db.Departments.ToList(); }
// Add more operations here and mark them with [OperationContract] } }
EmployeesInfo2Sevice.svc.cs代码如下: using System; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.Collections.Generic; using System.Text; using EmployeesContext;//引入数据库实体所在命名空间 using EmployeesEntities;//引入数据表实体所在命名空间
namespace DataGridnComboBox { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class EmployeesInfo2Service {
[OperationContract] public List<Employees> GetEmployeesInfo(int departmentid) { EmployeeModelDataContext db = new EmployeeModelDataContext(); return db.Employees.Where(x => x.DepartmentID == departmentid).ToList(); }
// Add more operations here and mark them with [OperationContract] } }
建立完成按Ctrl+Shift+B进行编译。
创建SilverlightClient界面及组件代码 MainPage.xaml代码: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas./markup-compatibility/2006" mc:Ignorable="d" xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightClient.MainPage" d:DesignWidth="320" d:DesignHeight="240"> <Grid x:Name="LayoutRoot" Width="320" Height="240" Background="White"> <dataInput:Label Height="20" HorizontalAlignment="Left" Margin="8,12,0,0" VerticalAlignment="Top" Width="43" FontSize="16" Content="部门:"/> <ComboBox x:Name="cbDepartment" Height="32" HorizontalAlignment="Left" Margin="59,6,0,0" VerticalAlignment="Top" Width="137" FontSize="14"/> <data:DataGrid x:Name="dgFilter" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="8,60,0,57" Width="267" FontSize="14"> <data:DataGrid.Columns> <data:DataGridTemplateColumn Header="查询姓名" Width="100"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding EmployeeName}"></TextBlock> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> <data:DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <ComboBox x:Name="CB" Loaded="CB_Loaded" Width="100" SelectedItem="{Binding EmployeeName,Mode=TwoWay}" /><!--注意:这里是实施动态联动的关键--> </DataTemplate> </data:DataGridTemplateColumn.CellEditingTemplate> </data:DataGridTemplateColumn> </data:DataGrid.Columns> </data:DataGrid> </Grid> </UserControl> MainPage.xaml.cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Data.Services.Client; using SilverlightClient.EmployeesInfoWCFService; using SilverlightClient.EmployeesInfo2WCFService;
namespace SilverlightClient { public partial class MainPage : UserControl { List<Employees> cbCBListProvider = new List<Employees>(); List<string> cbCBContent = new List<string>();
public MainPage() { InitializeComponent(); this.Loaded += new RoutedEventHandler(MainPage_Loaded); this.cbDepartment.SelectionChanged += new SelectionChangedEventHandler(cbDepartment_SelectionChanged); }
void cbDepartment_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (cbDepartment.SelectedItem != null) { int departmentid = ((Departments)cbDepartment.SelectedItem).DepartmentID; EmployeesInfo2ServiceClient webClient = new EmployeesInfo2ServiceClient(); webClient.GetEmployeesInfoAsync(departmentid); webClient.GetEmployeesInfoCompleted += new EventHandler<GetEmployeesInfoCompletedEventArgs>(webClient_GetEmployeesInfoCompleted); } }
void webClient_GetEmployeesInfoCompleted(object sender, GetEmployeesInfoCompletedEventArgs e) { cbCBListProvider = e.Result.ToList<Employees>(); }
void MainPage_Loaded(object sender, RoutedEventArgs e) { //示例数据 List<Employees> em = new List<Employees>(); em.Add(new Employees() { EmployeeName = "张三" }); em.Add(new Employees() { EmployeeName = "李四" }); dgFilter.ItemsSource = em; EmployeesInfoSeviceClient webClient = new EmployeesInfoSeviceClient(); webClient.GetEmployeesDepartmentAsync(); webClient.GetEmployeesDepartmentCompleted += new EventHandler<GetEmployeesDepartmentCompletedEventArgs>(webClient_GetEmployeesDepartmentCompleted); }
void webClient_GetEmployeesDepartmentCompleted(object sender, GetEmployeesDepartmentCompletedEventArgs e) { cbDepartment.ItemsSource = e.Result; cbDepartment.DisplayMemberPath = "DepartmentName"; }
void CB_Loaded(object sender, RoutedEventArgs e)//处理dgFilter加载的ComboBox的数据源 { ComboBox curComboBox = sender as ComboBox; cbCBContent.Clear(); cbCBListProvider.ForEach(x => cbCBContent.Add(x.EmployeeName)); curComboBox.ItemsSource = cbCBContent; }
} }
最终效果图
|
|