※ System.Data.Linq を参照して下さい 元々は、Windows Phone のテンプレートにあるバインド方法ですが、DataGrid にある AutoGenerateColumns プロパティはデフォルトで ON です。そもそも、こういう目的に使えるようにできています。 テーブル定義用のクラスは、ObservableCollection<T> でまとめられる必要があるので、ExecuteQuery
の結果を使って ObservableCollection<T> を作り直して DataContext に設定します。その際、ItemsSource は、{Binding} である必要があります。 ※ 社員マスタの列はもっとたくさんあります MainWindow.xaml
<Window x:Class="WpfDataGrid.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <DataGrid Height="217" HorizontalAlignment="Left" Margin="54,56,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="399" AutoGenerateColumns="True" ItemsSource="{Binding}" /> <Button Content="Button" Height="24" HorizontalAlignment="Left" Margin="55,17,0,0" Name="button1" VerticalAlignment="Top" Width="113" Click="button1_Click" /> </Grid> </Window>
MainWindow.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Data; using System.Data.Odbc; using System.Diagnostics; using System.Data.Linq; using System.Collections.ObjectModel; namespace WpfDataGrid { public partial class MainWindow : Window { private OdbcConnection cn = null; public MainWindow() { InitializeComponent(); } private class Syain { public string @社員コード { get; set; } public string @氏名 { get; set; } } private void button1_Click(object sender, RoutedEventArgs e) { string cs = "Driver={MySQL ODBC 5.2 Unicode Driver};" + "Server=localhost;" + "Database=lightbox;" + "Uid=root;" + "Pwd=password;"; string query = String.Format("select 社員コード,氏名 from 社員マスタ where 社員コード >= '{0}'", "0005"); try { cn = new OdbcConnection(cs); DataContext context = new DataContext(cn); this.dataGrid1.DataContext = new ObservableCollection<Syain>( context.ExecuteQuery<Syain>(query) ); } catch( Exception ex ) { Debug.WriteLine(ex.Message); } if ( cn.State == ConnectionState.Open ) { cn.Close(); cn.Dispose(); } } } }
ただ、VS2010 では、バグがあるようで、行が1行多く作成されてしまいます。VS2012 ではうまく行くんですが・・・。それと、ExecuteQuery の変数バインド機能は動作しませんでした。 CanUserAddRowsを 意図的に false にする必要があります。( デフォルトが true でした )。後、セル内の編集が必要無いのであれば、IsReadOnly を true にしてもかまいません。
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート