首页 文章

发出绑定数据表到WPF数据网格

提问于
浏览
2

我的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数据网格?

enter image description here

这是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

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

enter image description here

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

我认为这种方法是预先定义XAML中的列,然后将数据绑定到XAML列,但没有一个代码可以工作....真的很令人沮丧 .

2 回答

  • 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>
    

相关问题