none
wpf DataGrid 数据绑定问题 RRS feed

  • 问题

  • 大家好!

         第一次做wpf程序,在做数据库数据显示/修改 时遇到一个问题,没找到相关帮助,请大家帮我看下。

          我有2个表,表1有machineid,machinename,controllerid......表2 controllerid,controllername......

          我想使用DataGrid来显示出来,每一行有machineid,machinename,controllerName,machineid不可更改,machineName使用DataGridTextColumn可更改,controllerName使用DataGridComboBoxColumn显示一个下拉列表,列出表2的所有name,同时选中表1中当前数据项的controllerid.如果用户修改了 下拉列表中的name,则最终表1的controllerid项需要变更。

    代码如下:

            <DataGrid Name="dgMachine" ItemsSource="{Binding}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn  Header="ID"  Binding="{Binding ID}"/>
                    <DataGridTextColumn Header="Name" Binding="{Binding MachineName}"/>
                     <DataGridComboBoxColumn  Header="Controller" SelectedItemBinding="{Binding ControllerID}" ItemsSource="{Binding}"/>
                </DataGrid.Columns>
            </DataGrid>

                string sSql = "select m.ID, m.MachineName, m.ControllerID, c.ControllerName, from Machine m , Controller c  where c.id=m.controllerID ";
                DataTable dt = SqlHelper.GetDataTable(sSql);
                 dgMachine.ItemsSource = dt.DefaultView;

    我现在DataGrid不会做的地方就是第三列的下拉列表部分,请问这个地方该如何做绑定?最好能有一个比较类似的完整示例程序,我没找到,谢谢大家。

     

    • 已移动 Lie You 2011年11月22日 5:04 Move it for good discussion (发件人:Visual C#)
    2011年11月21日 9:08

答案

  • 你好,

    下面是一个简单的例子:

    <Window x:Class="WPFSandBox.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="500" Width="700">
        <Grid>
            <DataGrid Name="dg" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding MachineName}"/>
                    <DataGridComboBoxColumn  x:Name="col"
                                             DisplayMemberPath="ControllerName"
                                             SelectedValuePath="ControllerId"
                                             SelectedValueBinding="{Binding CId}"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

     

    namespace WPFSandBox
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                DataTable dt1 = new DataTable();
                dt1.Columns.Add(new DataColumn("MachineName", typeof(string)));
                dt1.Columns.Add(new DataColumn("CId", typeof(int)));
    
                DataTable dt2 = new DataTable();
                dt2.Columns.Add(new DataColumn("ControllerId", typeof(int)));
                dt2.Columns.Add(new DataColumn("ControllerName", typeof(string)));
    
                dt1.Rows.Add(new object[2] { "MachineA", 1 });
                dt1.Rows.Add(new object[2] { "MachineB", 2 });
                dt1.Rows.Add(new object[2] { "MachineC", 2 });
                dt1.Rows.Add(new object[2] { "MachineD", 1 });
    
                dt2.Rows.Add(new object[2] { 1, "ControllerA" });
                dt2.Rows.Add(new object[2] { 2, "ControllerB" });
    
                dg.ItemsSource = dt1.DefaultView;
                col.ItemsSource = dt2.DefaultView;
            }
    
        }
    }
    

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 tobzk 2011年11月23日 8:36
    2011年11月23日 3:54
    版主

全部回复

  • <DataGridComboBoxColumn  ItemsSource="{Binding Path=xx}" /> 
    2011年11月22日 7:49
  • 谢谢您的回复,但是2个表,似乎是2个数据源,用这个办法好像是不行的,或者您说的不太详细,抱歉,以前一直在做c++,第一次做c#和wpf,对这个不是太熟悉,麻烦您能否再详细一点?
    2011年11月23日 2:56
  • 你好,

    下面是一个简单的例子:

    <Window x:Class="WPFSandBox.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="500" Width="700">
        <Grid>
            <DataGrid Name="dg" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding MachineName}"/>
                    <DataGridComboBoxColumn  x:Name="col"
                                             DisplayMemberPath="ControllerName"
                                             SelectedValuePath="ControllerId"
                                             SelectedValueBinding="{Binding CId}"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

     

    namespace WPFSandBox
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                DataTable dt1 = new DataTable();
                dt1.Columns.Add(new DataColumn("MachineName", typeof(string)));
                dt1.Columns.Add(new DataColumn("CId", typeof(int)));
    
                DataTable dt2 = new DataTable();
                dt2.Columns.Add(new DataColumn("ControllerId", typeof(int)));
                dt2.Columns.Add(new DataColumn("ControllerName", typeof(string)));
    
                dt1.Rows.Add(new object[2] { "MachineA", 1 });
                dt1.Rows.Add(new object[2] { "MachineB", 2 });
                dt1.Rows.Add(new object[2] { "MachineC", 2 });
                dt1.Rows.Add(new object[2] { "MachineD", 1 });
    
                dt2.Rows.Add(new object[2] { 1, "ControllerA" });
                dt2.Rows.Add(new object[2] { 2, "ControllerB" });
    
                dg.ItemsSource = dt1.DefaultView;
                col.ItemsSource = dt2.DefaultView;
            }
    
        }
    }
    

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 tobzk 2011年11月23日 8:36
    2011年11月23日 3:54
    版主
  • 太谢谢版主了,果然好用,同时还解决了我另外一个问题,一直不知道在代码中怎么操作DataGrid的的Columns,原来是这样,设一个x:Name就行了。
    2011年11月23日 8:42