[C#]データバインディングについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラミング勉強中

[C#]データバインディングについて

#1

投稿記事 by プログラミング勉強中 » 2年前

現在、C#でデータバインディングを実装したくて以下のサイトを見てその通りに書いて、コンパイルはできたのですが、インスタンスへのアクセス方法が分かりません。
http://kitunechan.hatenablog.jp/entry/2015/04/16/123314

最後の行で

this.バインドするクラスBindingSource.DataSource = new バインドするクラス();

として、バインドするインスタンスを作成していますが、このインスタンスへどうやってアクセスしたらいいんでしょうか?this.バインドするクラスBindingSource.DataSource.としても何もメンバーとかが出てきません。

Math

Re: [C#]データバインディングについて

#2

投稿記事 by Math » 2年前

http://dixq.net/forum/viewtopic.php?f=3&t=18676
に書いたようにWPFアプリでは xaml で簡単に記述できますがFormアプリの場合は見られたサイトのように説明が複雑になっています。(^^;

使われているVisualStudioのVersion と作られたコードを提示頂ければわかりやすく説明が出来ると思いますので詳しい説明を送ってください。

YuO
記事: 936
登録日時: 8年前
住所: 東京都世田谷区

Re: [C#]データバインディングについて

#3

投稿記事 by YuO » 2年前

プログラミング勉強中 さんが書きました: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)を用意する
のどちらか(前者が推奨されています)を行う必用があります。

Math

Re: [C#]データバインディングについて

#4

投稿記事 by Math » 2年前

私のホームページ
http://powershell-vb-memo.nisinippon.com/form.html
をご覧下さい。

http://powershell-vb-memo.nisinippon.co ... m0201.html
のようにすればいいはずです。

大分以前にかいたので質問していただけばと思います。

プログラミング勉強中

Re: [C#]データバインディングについて

#5

投稿記事 by プログラミング勉強中 » 2年前

何の設定もしてないtextBox2で試してみました。
http://powershell-vb-memo.nisinippon.co ... 1.htmlを参考に

this.textBox2.DataBindings.Add(new Binding("Text", d, "data1"));
d.data1="abc";

と書きましたが、それでもtextBox2は空のままでした。
このコードを書けばプロパティで何操作する必要はないのでしょうか?それが足りないのかもしれません。

Math

Re: [C#]データバインディングについて

#6

投稿記事 by Math » 2年前

VisualStudioのVersionはVS2017Communityでしょうか?。

全体のコードを送れますか。
http://powershell-vb-memo.nisinippon.co ... 1.html
はエラーでわかりませんが。(^^;

Math

Re: [C#]データバインディングについて

#7

投稿記事 by Math » 2年前

VisualStudioのVersionはVS2017Communityと仮定して簡単にはこうなりますね。
画像

Math

Re: [C#]データバインディングについて

#8

投稿記事 by Math » 2年前

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; } // プロパティを設定すること
}
////////////////////////////////////////////////////////////////////////////////

Math

Re: [C#]データバインディングについて

#9

投稿記事 by Math » 2年前

通常実務ではデータソースとしてSQLサーバー、ACCESSデータベース、xmlデータ等が想定されているのでそれを用意しておきますね。

sleep

Re: [C#]データバインディングについて

#10

投稿記事 by sleep » 2年前

以下は解説動画。
C# WinForm Property Bindings

現段階ですべてを理解するのは無理かと思いますが、この動画の内容程度なら見て真似をすれば理解するための最初の1歩を踏み出すくらいの経験は積めます。

Math

Re: [C#]データバインディングについて

#11

投稿記事 by Math » 2年前

ボタンを追加します。OneWayだからこの様になります。
画像

TwoWayにするにはインターフェイスINotifyPropertyChangedを実装します。
http://powershell-vb-memo.nisinippon.co ... m0202.html


Math

Re: [C#]データバインディングについて

#13

投稿記事 by Math » 2年前

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#]データバインディングについて

#14

投稿記事 by プログラミング勉強中 » 2年前

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#]データバインディングについて

#15

投稿記事 by プログラミング勉強中 » 2年前

VersionですがVS2013です。

Math

Re: [C#]データバインディングについて

#16

投稿記事 by Math » 2年前

C# Form アプリケーションではあまり利点が見当たらないですものね。
WPFでは普通に使われる技術で便利なのですが Formアプリケーションではあまり利点はなく逆に応用しようとするといきづまります。
XAMLを使わないのであればあまり深入りしないでいいと思います。

VS2013でも動くはずなので (TwoWayの動作のことを言ってると思うので)コードをコピーして動かすと分かると思いますけど。

Math

Re: [C#]データバインディングについて

#17

投稿記事 by Math » 2年前

私のホームページにあるようにDataGridViewにデータベースを表示させたり 入力・出力画面を作ったりするときは便利です。
(使わないでも出来る)
INotifyPropertyChangedインターフェースについてググって見れば情報は沢山あると思います。


返信

“C言語何でも質問掲示板” へ戻る