首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF中的CollectionViewSource不显示来自DataTable的数据

WPF中的CollectionViewSource不显示来自DataTable的数据
EN

Stack Overflow用户
提问于 2021-03-06 02:56:47
回答 1查看 66关注 0票数 1

来自DataTable的数据不会填充ComboBox或TextBox。来自SQL Server数据库的数据用于填充DataTable,它工作得很好,我认为CollectionViewSource也没问题,但是没有显示到显示元素的绑定。

我最初是从TableAdapter设计器中创建视图的,它工作得很好,显示了数据,我可以在表行之间移动。我需要为到数据源的SQL连接编写代码,因此我创建了一个SQL Data Adapter,使用它填充一个dataset,然后从该数据集创建一个DataTable。浏览调试器,我可以看到DataTable ("compDataTable")包含所有数据。然后我使用这个DataTable作为CollectionViewSource ('tbl_CompsViewSource')来绑定到我的视图控件,就像最初的TableAdapter一样,但是当我运行它时,视图控件是空白的。我试图通过System.Diagnostics调试绑定,但它没有显示任何错误,除非它试图填充视图控件。抛出的错误是:

System.Windows.Data错误: 40 : BindingExpression路径错误:在'object‘Char’(HashCode=4325442)‘’上找不到'Name‘属性。BindingExpression:Path=Name;DataItem='Char‘(HashCode=4325442);目标元素为'ComboBox’(名称=‘ComboBox’);目标属性为'NoTarget‘(类型为'Object')

System.Windows.Data错误: 40 : BindingExpression路径错误:在'object‘EnumerableCollectionView’(HashCode=28278595)‘’上找不到'Value‘属性。BindingExpression:Path=Value;DataItem='EnumerableCollectionView‘(HashCode=28278595);目标元素为'TextBox’(Name='valueTextBox');目标属性为'Text‘(类型为'String')

XML代码是:

代码语言:javascript
运行
复制
<Window x:Class="CompsTabAdapt.MainWindow"
    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"
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
    Title="MainWindow" Loaded="Window_Loaded">
<Window.Resources>
    <CollectionViewSource x:Key="tbl_CompsViewSource" Source="{Binding Source=compDataTable}" diag:PresentationTraceSources.TraceLevel="High"/>
</Window.Resources>

<StackPanel DataContext="{Binding tbl_CompsViewSource}">
    <Label Content="Compound :"/>
    <ComboBox x:Name="nameComboBox" DisplayMemberPath="Name" ItemsSource="{Binding}" IsEditable="True">
        <ComboBox.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel/>
            </ItemsPanelTemplate>
        </ComboBox.ItemsPanel>
    </ComboBox>
    <StackPanel Orientation="Horizontal">
        <Label Width="120">Value: </Label>
        <TextBox x:Name="valueTextBox" Text="{Binding Value, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
    </StackPanel>
</StackPanel>
</Window>

后面的代码是:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace CompsTabAdapt
{
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    SqlDataAdapter CompsDataAdapt = new SqlDataAdapter();
    DataSet compDataSet = new DataSet();
    DataTable compDataTable = new DataTable();
    CollectionViewSource tbl_CompsViewSource = new CollectionViewSource();


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        try
        {
            string dbcon = ConfigurationManager.ConnectionStrings["ConnOrigString"].ConnectionString;
            using (SqlConnection Connection = new SqlConnection(dbcon))
            {
                Connection.Open();
                CompsDataAdapt = new SqlDataAdapter("SELECT * FROM tbl_Comps", Connection);
                CompsDataAdapt.Fill(compDataSet);
                Connection.Close();
                compDataTable = compDataSet.Tables[0];
            }
        }
        catch
        {
            dbConnect();
        }
        finally
        {
            tbl_CompsViewSource = (CollectionViewSource)(this.FindResource("tbl_CompsViewSource"));
            tbl_CompsViewSource.View.MoveCurrentToFirst();
        }
}
}
EN

回答 1

Stack Overflow用户

发布于 2021-03-06 03:48:46

System.Windows.Data Error: 40 : BindingExpression path error: 'Value' property not found on 'object' ''EnumerableCollectionView' (HashCode=28278595)'. BindingExpression:Path=Value; DataItem='EnumerableCollectionView' (HashCode=28278595); target element is 'TextBox' (Name='valueTextBox'); target property is 'Text' (type 'String')这条消息告诉你的是,它没有在名为"valueTextBox“的TextBox的绑定源上找到属性Value。看一下xaml <TextBox x:Name="valueTextBox" Text="{Binding Value, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>,没有为绑定定义任何源,所以源将是它的datacontex (或者在本例中,是具有设置的datacontext的第一个父数据的datacontex )。这是堆叠面板

代码语言:javascript
运行
复制
<Window.Resources>
     <CollectionViewSource x:Key="tbl_CompsViewSource" Source="{Binding Source=compDataTable}" diag:PresentationTraceSources.TraceLevel="High"/>
</Window.Resources>

<StackPanel DataContext="{Binding tbl_CompsViewSource}">

所以源代码是compDataTable,它是在后面的代码中定义的(你可能应该显式地设置acess修饰符,我很惊讶地看到它是acessible)。

在后面的代码中,我可以看到compDataTable = compDataSet.Tables[0];,因此compDataTable的类型是Table,但是类型表没有名为Value的属性,因此绑定失败。

关于另一个错误,您将compDataTable视为一个集合,并试图访问它的一个项的Name属性,当然这是失败的。

我的猜测是,您打算访问该表中的行,因此应该检查this link,它提供了一个如何访问数据的示例。

代码语言:javascript
运行
复制
foreach(DataTable table in dataSet.Tables)
{
    foreach(DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            //Add it to a list instead and bind the list
            Console.WriteLine(row[column]);
        }
    }
}

*链接中的示例

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66498115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档