【问题标题】:Issue binding datatable to WPF datagrid将数据表绑定到 WPF 数据网格
【发布时间】:2017-05-14 21:12:25
【问题描述】:

我的 XAML 如下:

<DataGrid x:Name="WaterfallDataGrid" HorizontalAlignment="Left" Height="540" Margin="10,410,0,0" VerticalAlignment="Top" Width="1650" CanUserSortColumns="False" ColumnWidth="60">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Load" Binding="{Binding Load}"></DataGridTextColumn>
        <DataGridTextColumn Header="PF" Binding="{Binding PF}"></DataGridTextColumn>
        <DataGridTextColumn Header="Spare" Binding="{Binding Spare}"></DataGridTextColumn>
    </DataGrid.Columns>
    </DataGrid>

我的VB.net代码如下:

 Dim dt3 As New DataTable("Waterfall")
        dt3.Columns.Add("Load")
        dt3.Columns.Add("PF")
        dt3.Columns.Add("Spare")
dt3.rows.add(New Objecet() {"full load", "0.8", "20%"})
WaterfallDataGrid.itemSource = dt3.defaultview

虽然数据表确实显示在数据网格上,但除了我在 XAML 中创建的原始 3 列之外,它还会创建另外 3 个新列(Load、PF 和 Spar)。

如何将 VB.net 代码绑定到 XAML 数据网格?

这是 Ed 的代码截图

这是我根据 Mark 的评论修改的代码。

<Window x:Class="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:local="clr-namespace:Datagrid_Binding"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="WaterfallDataGrid" HorizontalAlignment="Left" Height="170" Margin="85,65,0,0" VerticalAlignment="Top" Width="340" AutoGenerateColumns="False"/>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="25" Margin="380,255,0,0" VerticalAlignment="Top" Width="45"/>

    </Grid>
</Window>

这是VB代码

Class MainWindow
    Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click
        Dim dt3 As New DataTable("Waterfall")
        dt3.Columns.Add("Load")
        dt3.Columns.Add("PF")
        dt3.Columns.Add("Spare")
        'dt3.rows.add(New Object() {"full load", "0.8", "20%"})
        dt3.Rows.Add("full load", "0.8", "20%")
        WaterfallDataGrid.ItemsSource = dt3.DefaultView
    End Sub
End Class

数据网格根本不显示任何数据。它以某种方式显示折叠的行。截图如下:

我认为问题在于,如果我没有在 XAML 中预定义列并且我在 vb.net 中定义了行但 autogeneratecolumn 设置为 false,则 VB 无法以编程方式创建列在运行时,所以我在这里看到的是折叠的行。

我认为该方法是在 XAML 中预定义列,然后将数据绑定到 XAML 列,但没有任何代码起作用....真是令人沮丧。

【问题讨论】:

  • 我现在正在测试您的代码,它的工作方式与您发布的方式完全相同。对于我对匿名对象的错误建议浪费您的时间,我深表歉意。不幸的是,这里肯定有其他原因导致了这个问题,但是如果没有看到足够大的代码示例来重现这个问题,我无法告诉你它可能是什么。
  • ...请注意,我更正了拼写错误“Objecet”和“itemSource”。但如果没有这些修复,它甚至无法编译,所以我想当你在这里重新输入代码时它们一定是悄悄溜进来的。
  • 对不起,埃德。这是我的错字,但 VS 中没有错字,因为否则无法编译。

标签: wpf vb.net xaml binding datagrid


【解决方案1】:

我认为问题中的屏幕截图可能与显示的代码无关。如果您的初始代码的唯一问题是生成的额外列,您只需将AutoGenerateColumns="False" 添加到DataGrid XAML:

<DataGrid x:Name="WaterfallDataGrid"
          HorizontalAlignment="Left"
          Height="540"
          Margin="10,410,0,0"
          VerticalAlignment="Top"
          Width="1650"
          CanUserSortColumns="False"
          ColumnWidth="60"
          AutoGenerateColumns="False">

另外,由于DataRowCollection.Add 采用ParamArray 参数,您无需创建Object 数组,只需单独传入列值,这样更易​​于阅读,例如

dt3.Rows.Add("full load", "0.8", "20%")

【讨论】:

    【解决方案2】:

    当您将 DataGrid 的 AutoGenerateColumns 属性设置为 False 时,您需要自己明确定义列,因此请使用原始 XAML 标记并添加 AutoGenerateColumns="False",您应该会看到三列:

    <DataGrid x:Name="WaterfallDataGrid" HorizontalAlignment="Left" Height="540" Margin="10,410,0,0" VerticalAlignment="Top" Width="1650" CanUserSortColumns="False" ColumnWidth="60" 
    AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Load" Binding="{Binding Load}"></DataGridTextColumn>
            <DataGridTextColumn Header="PF" Binding="{Binding PF}"></DataGridTextColumn>
            <DataGridTextColumn Header="Spare" Binding="{Binding Spare}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    

    为了摆脱额外的空白行,以便用户能够添加新行,您可以将 CanUserAddRows 属性设置为 False:

    <DataGrid x:Name="WaterfallDataGrid" CanUserAddRows="False" ...
    

    是的,我知道这一点。问题是虽然我可以在 XAML 中创建 3 列,但我无法通过上面的 VB 代码将数据绑定到列。

    以下完整的代码示例对我来说确实可以正常工作。

    MainWindow.xaml.vb:

    Class MainWindow
        Public Sub New()
    
            ' This call is required by the designer.
            InitializeComponent()
    
            ' Add any initialization after the InitializeComponent() call.
            Dim dt3 As New DataTable("Waterfall")
            dt3.Columns.Add("Load")
            dt3.Columns.Add("PF")
            dt3.Columns.Add("Spare")
            'dt3.rows.add(New Object() {"full load", "0.8", "20%"})
            dt3.Rows.Add("full load", "0.8", "20%")
            WaterfallDataGrid.ItemsSource = dt3.DefaultView
    
        End Sub
    End Class
    

    MainWindow.xaml:

    <Window
            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:local="clr-namespace:WpfApplicationVb1"
            xmlns:System="clr-namespace:System;assembly=mscorlib"
            xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" x:Class="MainWindow"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <DataGrid x:Name="WaterfallDataGrid" CanUserSortColumns="False" ColumnWidth="60" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Load" Binding="{Binding Load}"></DataGridTextColumn>
                    <DataGridTextColumn Header="PF" Binding="{Binding PF}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Spare" Binding="{Binding Spare}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>
    

    【讨论】:

    • 是的,我知道这一点。问题是虽然我可以在 XAML 中创建 3 列,但我无法通过上面的 VB 代码将数据绑定到列。
    • 我不知道你做错了什么。请参考我编辑的答案中的示例代码。
    • 谢谢。我使用了您的代码,现在一切正常。干杯。
    猜你喜欢
    • 2011-01-31
    • 2015-08-07
    • 1970-01-01
    • 2012-11-21
    • 2022-10-15
    • 2013-07-27
    • 2011-05-28
    • 1970-01-01
    • 2011-10-26
    相关资源
    最近更新 更多