2016-12-30 12 views
2

私のXAMLはWPFのデータグリッドにデータテーブル結合します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

申し訳ありません。それは私のタイプミスでしたが、それ以外の場合はコンパイルされないので、VSにはタイプミスはありません。 – Tofulover

答えて

1

あなたがFalseにデータグリッドのAutoGenerateColumnsプロパティを設定するときは、explitly自身がそうAutoGenerateColumns =「false」を追加して、あなたのオリジナルのXAMLマークアップを使用して、3つの列表示されるはずの列を定義する必要があります。

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

新しい行を追加できるようにユーザーのためにそこにある余分な空白行を取り除くために、あなたはFalseにCanUserAddRowsプロパティを設定できます

<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

質問のスクリーンショットは、表示されているコードに関連していない可能性があります。あなたの最初のコードの唯一の問題は、追加の列が生成されていた場合、あなただけのDataGrid 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"> 

DataRowCollection.AddParamArray引数を取るために、あなたが作成する必要はありません。 Object配列を持ち、列の値を個別に渡すことができます。これは少し読みやすいです。

dt3.Rows.Add("full load", "0.8", "20%") 
関連する問題