积极答复者
wpf DataGrid 数据绑定问题

问题
-
大家好!
第一次做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#)
答案
-
你好,
下面是一个简单的例子:
<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
全部回复
-
你好,
下面是一个简单的例子:
<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