C# WPF将DataTable列绑定到文本框

C# WPF将DataTable列绑定到文本框,c#,wpf,data-binding,textbox,datatable,C#,Wpf,Data Binding,Textbox,Datatable,我刚开始使用WPF,发现即使是最简单的绑定也很难工作。这里有一些赠品 我有一个查询现有数据库并返回“datatable”对象的对象,数据返回(出于测试目的,只有一行和一列称为“MyTextColumn”) 数据表不是“强类型”的,正如我在其他地方读到的,它试图强制解决强类型对象的问题。我想从代码隐藏的角度理解底层机制,而不是从XAML的角度。从读取来看,显然不能直接绑定到数据表,但可以绑定到数据表对象的“DefaultView”(因为它们指向同一条记录(或一组记录,比如某种类型的过滤器除外),所

我刚开始使用WPF,发现即使是最简单的绑定也很难工作。这里有一些赠品

我有一个查询现有数据库并返回“datatable”对象的对象,数据返回(出于测试目的,只有一行和一列称为“MyTextColumn”)

数据表不是“强类型”的,正如我在其他地方读到的,它试图强制解决强类型对象的问题。我想从代码隐藏的角度理解底层机制,而不是从XAML的角度。从读取来看,显然不能直接绑定到数据表,但可以绑定到数据表对象的“DefaultView”(因为它们指向同一条记录(或一组记录,比如某种类型的过滤器除外),所以对我来说没有意义)

因此,在窗口的XAML部分


现在,我正在编写代码,我读到的是你必须有一个BindingListCollectionView-oView

public partial class MyWindow : Window
{
  BindingListCollectionView oView;
  MyQueryingManager oTestMgr;

  public MyWindow()
  {
    InitializeComponent();

    oTestMgr = new MyQueryingManager();
    DataTable oResults = oTestMgr.GetTheData();

    // Data context for the form bound to the Table retrieved
    oView = new BindingListCollectionView( oResults.DefaultView );

    // One place said the Window should get the binding context
    DataContext = oView;

    // another indicated the grid...  Just need to know which I SHOULD be using
    grdTesting.DataContext = oView;


    // Now, for my binding preparation...
    Binding bindMyColumn = new Binding();
    bindMyColumn.Source = oView;
    bindMyColumn.Path = new PropertyPath("MyTextColumn");
    txtMyTextColumn.SetBinding( TextBox.TextProperty, bindMyColumn );
  }
}
所以…我这里缺少什么…应该很简单,没有什么复杂的,我有一个数据表,有一个记录,有一个值。运行表单(无论绑定到窗口或网格的上下文),记录值不会显示在textbox控件中。一旦我了解单个textbox的行为,我就可以继续使用所有其他元素(验证、输入掩码、格式设置等),但我在这件事上被卡住了


谢谢,网格只是一个布局面板(想想电子表格)。你必须手动将控件放入单元格中


您正在寻找的可能是一个数据网格,它能够使用反射自动生成列(或者您可以自己定义)。如果您不想使用众多第三方数据网格控件中的一个,可以使用该控件。

您使用的网格是布局控件,这意味着它具有作为子项的可视元素,而不是项。例如,您应该使用类似Listbox的ItemsControl,并将ItemsSource属性绑定到您的集合。

首先,您可以使用绑定到
数据表
,但也可以使用默认视图(即
数据视图
)等

通常,您将
数据表
绑定到
项控件
或从中派生的控件,如
列表框
数据网格
等。然后每个容器将获得一个
数据行
(或
数据行视图
),绑定将很容易

由于要将其直接绑定到
网格中的
文本框
,因此必须在绑定中同时指定
。绑定到第一行中名为“MyTextColumn”的列的正确路径是
行[0][MyTextColumn]

试试这个

Binding bindMyColumn = new Binding();
bindMyColumn.Source = oResults;
bindMyColumn.Path = new PropertyPath("Rows[0][MyTextColumn]");
txtMyTextColumn.SetBinding(TextBox.TextProperty, bindMyColumn);
如果您直接绑定到
数据表
,问题在于它没有实现
INotifyPropertyChanged
,因此如果从其他源更改值,UI将不知道该值已更改。在这种情况下,您可以改为使用
数据视图
。自从您访问后,这里的绑定语法将略有不同直接使用索引运算符设置
数据行视图

dataView = oResults.DefaultView;
// Now, for my binding preparation...
Binding bindMyColumn = new Binding();
bindMyColumn.Source = dataView;
bindMyColumn.Path = new PropertyPath("[0][MyTextColumn]");
txtMyTextColumn.SetBinding(TextBox.TextProperty, bindMyColumn);

我熟悉C#Winforms中的DataGrid绑定,如果我想要列式输出,这没有问题。但是,我更希望使用多个“组”编辑数据条目控件。就像订单输入系统一样,您将有一个部分用于显示客户名称/地址、其他用于计费的元素、其他用于注释/注释的元素,如发票标题中显示的信息。一次输入一个条目,而不是多个记录。请参阅我在该问答组中菲利浦施密德下的注释。您的解决方案听起来很简单est无法正常工作,但运行表单时仍无法获得任何输出。我仍在使用选项和设置查看缺少的部分。您对路径的引用为“行[0][MyTextColumn]”似乎不起作用,因为它需要引用DataView,而DataView又有DataViewRow对象。因此,我在调试器中逐步查找可能缺少的内容。@DRapp:如果您使用
DataView
作为源,请参阅我答案的最后一部分。路径应为
“[0][MyTextColumn]”
@DRapp:上载了一个示例应用程序,供您查看并与您的尝试进行比较。它执行
DataTable
DataView
绑定: