• DataGrid 内嵌ComboBox动态数据联动


    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]

    [Department]


    关系图:



    创建Linq to SQL数据模型

    具体步骤参照我的强大的DataGrid组件[3]_数据交互之Linq to SQL——Silverlight学习笔记[11]

    下面是EmployeeModel.dbml图

     


    建立Silverlight-enabled WCF Web Service

    具体步骤参照我的强大的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.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<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;

            }

     

           

        }

    }

    最终效果图


  • 相关阅读:
    C#接口入门学习
    消息队列接收时报错:对消息队列系统的访问被拒绝
    给某做测试的好友的建议
    在不同的Sql Server 数据库服务器(不同机器)导数据。
    如何让开发人员更好测试?
    存储过程初探
    语音报警.NET开发初探
    vs2010下Siverlight开发环境安装
    C# HttpWebRequest 从google服务器获取google的PageRank PR值
    创建进程API CreateProcess Demo
  • 原文地址:https://www.cnblogs.com/zhangq723/p/1707445.html
Copyright © 2020-2023  润新知