2016-12-30 50 views
2

我的XAML如下:問題結合數據表到WPF數據網格

<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

這裏是繼埃德的代碼

截圖下面是我修改以下馬克的評論的代碼。

<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列,但沒有任何代碼工作....真的很沮喪。

+0

我現在測試你的代碼,它的工作原理完全貼你的方式。我很抱歉因爲我對匿名對象的錯誤建議而浪費你的時間。不幸的是,這裏一定會有其他問題引發這個問題,但如果沒有看到足夠大的代碼示例來重現問題,我不能告訴你它會是什麼。 –

+0

...但請注意,我更正了錯字「Objecet」和「itemSource」。但是如果沒有這些固定的東西,它甚至不會編譯,所以我想當你在這裏重新輸入代碼時,它們一定會悄悄進入。 –

+0

對不起Ed。那是我的一個錯字,但是VS中沒有錯別字,因爲它不會另外編譯。 – Tofulover

回答

1

當您將DataGrid的AutoGenerateColumns屬性設置爲False,你需要explitly定義列自己那麼使用原來的XAML標記與另外的AutoGenerateColumns =「假」,你應該看到三列:

<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> 
+0

是的,我知道這一點。問題是,儘管我可以在XAML中創建3列,但我無法通過上面的VB代碼將數據綁定到列。 – Tofulover

+0

我不知道你做錯了什麼。請參閱我編輯的答案中的示例代碼。 – mm8

+0

謝謝你。我用你的代碼,現在正在工作。乾杯。 – Tofulover

2

我認爲這個問題的截圖可能與所顯示的代碼無關。如果正在生成您的初始代碼的唯一問題了額外的列,您只需要添加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%")