热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

强大的DataGrid组件[8]_内嵌ComboBox动态数据联动

发布时间:2009年09月17日点击数: Kinglee

返回教程连载目录 

在DataGrid的单元格中嵌入ComboBox是十分常见且是经常使用的一个操作。在上一篇中,我为大家介绍了如何使用静态资源绑定作为ComboBox的数据源。然而,在实际开发的过程中,我们经常会碰到处理动态数据的问题。本文将为大家介绍如何动态绑定DataGrid中ComboBox的数据源。

准备工作
1)测试项目的建立
请参考我的强大的DataGrid组件[2]_数据交互
2)创建测试用数据库
为了实现数据联动,我们需要在测试数据库Employees中创建如下的两张数据表。(使用SQL Server Express创建)
两表的字段属性:
[Employee]

[Department]

关系图:

创建Linq to SQL数据模型
具体步骤参照我的强大的DataGrid组件[3]_数据交互之Linq to SQL
下面是EmployeeModel.dbml图

建立Silverlight-enabled WCF Web Service
具体步骤参照我的强大的DataGrid组件[3]_数据交互之Linq to SQL
我们需要建立如下的两个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 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 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.openxmlformats.org/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 cbCBListProvider = new List();
        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(webClient_GetEmployeesInfoCompleted);
            }

        }

      
        void webClient_GetEmployeesInfoCompleted(object sender, GetEmployeesInfoCompletedEventArgs e)
        {
            cbCBListProvider = e.Result.ToList();
        }


        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            //示例数据
            List em = new List();
            em.Add(new Employees() { EmployeeName = "张三" });
            em.Add(new Employees() { EmployeeName = "李四" });
            dgFilter.ItemsSource = em;
            EmployeesInfoSeviceClient webClient = new EmployeesInfoSeviceClient();
            webClient.GetEmployeesDepartmentAsync();
            webClient.GetEmployeesDepartmentCompleted +=
              new EventHandler(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;
        }


      
    }

}

 

最终效果图

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作