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

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: [C#]データバインディングについて

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

#18

by Math » 6年前

Formのデータバインディングについて
https://msdn.microsoft.com/ja-jp/librar ... .110).aspx

WPFのデータバインディングについて
https://msdn.microsoft.com/ja-jp/librar ... .110).aspx

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

#17

by Math » 6年前

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

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

#16

by Math » 6年前

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

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

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

#15

by プログラミング勉強中 » 6年前

VersionですがVS2013です。

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

#14

by プログラミング勉強中 » 6年前

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

#13

by Math » 6年前

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

#12

by Math » 6年前

VS2017:TwoWay実装
画像

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

#11

by Math » 6年前

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

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

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

#10

by sleep » 6年前

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

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

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

#9

by Math » 6年前

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

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

#8

by Math » 6年前

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

#7

by Math » 6年前

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

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

#6

by Math » 6年前

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

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

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

#5

by プログラミング勉強中 » 6年前

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

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

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

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

#4

by Math » 6年前

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

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

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

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

#3

by YuO » 6年前

プログラミング勉強中 さんが書きました: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#]データバインディングについて

#2

by Math » 6年前

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

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

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

#1

by プログラミング勉強中 » 6年前

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

最後の行で

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

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

ページトップ