ページ 1 / 1
[C#]データバインディングについて
Posted: 2017年8月13日(日) 20:48
by プログラミング勉強中
現在、C#でデータバインディングを実装したくて以下のサイトを見てその通りに書いて、コンパイルはできたのですが、インスタンスへのアクセス方法が分かりません。
http://kitunechan.hatenablog.jp/entry/2015/04/16/123314
最後の行で
this.バインドするクラスBindingSource.DataSource = new バインドするクラス();
として、バインドするインスタンスを作成していますが、このインスタンスへどうやってアクセスしたらいいんでしょうか?this.バインドするクラスBindingSource.DataSource.としても何もメンバーとかが出てきません。
Re: [C#]データバインディングについて
Posted: 2017年8月13日(日) 21:28
by Math
http://dixq.net/forum/viewtopic.php?f=3&t=18676
に書いたようにWPFアプリでは xaml で簡単に記述できますがFormアプリの場合は見られたサイトのように説明が複雑になっています。(^^;
使われているVisualStudioのVersion と作られたコードを提示頂ければわかりやすく説明が出来ると思いますので詳しい説明を送ってください。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 06:40
by YuO
プログラミング勉強中 さんが書きました:this.バインドするクラスBindingSource.DataSource = new バインドするクラス();
として、バインドするインスタンスを作成していますが、このインスタンスへどうやってアクセスしたらいいんでしょうか?this.バインドするクラスBindingSource.DataSource.としても何もメンバーとかが出てきません。
上記のコードでは、単純にバインドするだけです。
DataSourceプロパティはobject型なので,object型にないメンバーへはキャスト無しにアクセスすることは出来ません。
バインドするクラスのインスタンスを別途newし,それをprivateなフィールドなりに保持してしまえば,DataSourceに設定してもフィールド経由でアクセスできます。
オフトピック
個人的には,Formでnewするのではなく,コンストラクタ等でModel (or ViewModel, Presenter, etc.) を渡す構造にします。
そうすることで,Viewとそれ以外の分離がしやすくなるためです。
WinFormのデザイナの都合上,引数無しのコンストラクタは必須ですが。
なお,バインドするクラスが
INotifyPropertyChangedも(プロパティ名)Changed形式のイベントも実装していないため,バインドされているインスタンスのプロパティを変更しても,コントロールの値は変更されません。
この方向の変更を通知したい場合は,
- INotifyPropertyChangedを実装する
- (プロパティ名)Changedというイベント(プロパティ名がTextならTextChanged)を用意する
のどちらか(前者が推奨されています)を行う必用があります。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 08:07
by Math
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 08:30
by プログラミング勉強中
何の設定もしてないtextBox2で試してみました。
http://powershell-vb-memo.nisinippon.co ... 1.htmlを参考に
this.textBox2.DataBindings.Add(new Binding("Text", d, "data1"));
d.data1="abc";
と書きましたが、それでもtextBox2は空のままでした。
このコードを書けばプロパティで何操作する必要はないのでしょうか?それが足りないのかもしれません。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 09:31
by Math
VisualStudioのVersionはVS2017Communityでしょうか?。
全体のコードを送れますか。
http://powershell-vb-memo.nisinippon.co ... 1.html
はエラーでわかりませんが。(^^;
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 11:10
by Math
VisualStudioのVersionはVS2017Communityと仮定して簡単にはこうなりますね。

Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 11:14
by Math
Form1.cs
コード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
DataSrc d;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.d = new DataSrc(); // データソースのインスタンス化
d.Name = "abc"; // データソースの値を設定する
this.textBox1.DataBindings.Add(new Binding("Text", d, "Name")); // データバインディング
}
}
}
// データソースとなるクラスを作る //////////////////////////////////////////////
public class DataSrc
{
public string Name { get; set; } // プロパティを設定すること
}
////////////////////////////////////////////////////////////////////////////////
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 11:30
by Math
通常実務ではデータソースとしてSQLサーバー、ACCESSデータベース、xmlデータ等が想定されているのでそれを用意しておきますね。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 11:38
by sleep
以下は解説動画。
C# WinForm Property Bindings
現段階ですべてを理解するのは無理かと思いますが、この動画の内容程度なら見て真似をすれば理解するための最初の1歩を踏み出すくらいの経験は積めます。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 12:17
by Math
ボタンを追加します。OneWayだからこの様になります。
TwoWayにするにはインターフェイスINotifyPropertyChangedを実装します。
http://powershell-vb-memo.nisinippon.co ... m0202.html
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 13:04
by Math
VS2017:TwoWay実装

Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 13:06
by Math
VS2017:TwoWay実装
コード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
DataSrc d;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.d = new DataSrc(); // データソースのインスタンス化
d.Name = "abc"; // データソースの値を設定する
this.textBox1.DataBindings.Add(new Binding("Text", d, "Name")); // データバインディング
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(d.Name);
}
private void button2_Click(object sender, EventArgs e)
{
d.Name = textBox2.ToString();
}
}
}
// データソースとなるクラスを作る //////////////////////////////////////////////
public class NofityPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
public class DataSrc : NofityPropertyChanged
{
private string privName;
public string Name // プロパティNameにNotifyPropertyChanged付加
{
get { return privName; }
set // セッター側に
{
if (value != privName)
{
privName = value;
NotifyPropertyChanged("Name");
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 23:34
by プログラミング勉強中
Mathさんご返信ありがとうございます。
this.d = new bindclass();
d.data1 = 1;
this.textBox2.DataBindings.Add(new Binding("Text", d, "data1"));
これだと表示されました。
this.d = new bindclass();
this.textBox2.DataBindings.Add(new Binding("Text", d, "data1"));
d.data1 = 1;
これだと表示されません。
さすがに意味が分かりませんでした。
Re: [C#]データバインディングについて
Posted: 2017年8月14日(月) 23:36
by プログラミング勉強中
VersionですがVS2013です。
Re: [C#]データバインディングについて
Posted: 2017年8月15日(火) 00:05
by Math
C# Form アプリケーションではあまり利点が見当たらないですものね。
WPFでは普通に使われる技術で便利なのですが Formアプリケーションではあまり利点はなく逆に応用しようとするといきづまります。
XAMLを使わないのであればあまり深入りしないでいいと思います。
VS2013でも動くはずなので (TwoWayの動作のことを言ってると思うので)コードをコピーして動かすと分かると思いますけど。
Re: [C#]データバインディングについて
Posted: 2017年8月15日(火) 00:17
by Math
私のホームページにあるようにDataGridViewにデータベースを表示させたり 入力・出力画面を作ったりするときは便利です。
(使わないでも出来る)
INotifyPropertyChangedインターフェースについてググって見れば情報は沢山あると思います。
Re: [C#]データバインディングについて
Posted: 2017年8月15日(火) 00:43
by Math