質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2029閲覧

ラムダ式内(戻り値部分で使用)でテキストボックスに値をいれたい

kazuya_

総合スコア78

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/04/17 10:57

C#のクラスメソッドの返り値にラムダ式を設定し、その内で、Formのテキストボックスに文字を表示させようとしましたがうまくいきません。クラスの生成時に、Formのインスタンス(this)?を渡して、thisからテキストボックスを辿っています。
また、ラムダ式内で、テキストボックスに入れるにはどうしたら良いでしょうか?
意味のないコードかもしれませんが、理由を知りたいのでお願い致します。テキストボックスは、プロパテイmodifiersをpublicにしています。

namespace action_ramda_test {
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Person xs = new Person(this);

xs.writa("fgfgfg",this); } } public class Person { public Action sa; public Form1 ft; public string st; public Person(Form1 Ft) { ft = Ft; } public Person(Form1 Ft,string St,Action Sa) { ft = Ft; st = St; sa = Sa; } public Person writa(string msg, Form1 F1) { // F1.textBox1.Text = msg; //TextBoxにfgfgfgがはいる return new Person(F1,msg,() => { F1.textBox1.Text = msg; });//TextBoxにfgfgfgがはいらない } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ラムダ式をsaに代入してるだけで実行されていないのでは?

投稿2017/04/17 11:12

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuya_

2017/04/17 12:36

ありがとうございました。
guest

0

ラムダ式を実行するコードが何処にもありません。

C#

1Action sa = () => { F1.textBox1.Text = msg; }; // ここでは実行されない 2sa(); // ここで実行される。

投稿2017/04/17 11:05

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ご回答ありがとございます。
ボタンクリックイベント内で
xs.writa("fgfgfg",this);
を実行して、その戻り値が、Personクラスを生成するので、そのときに、コンストラクタ内
で、デリゲート( () => { F1.textBox1.Text = msg; })の部分がデバッグモードでは
トレースされるのですが、(この時、msgにはfgfgfgが入っています)、textBox1には
入ってきませんでした。
直前の、//F1.texyBox1.Text = Msg;のコメントを外して実験的に実行すると、
fgfgfgは入ってきます。
リターン式内のPersonクラスを生成するときに実行して、textBox1に入れたいのが趣旨なので
直接、デリゲートを実行?した場合はうまくいくと思います。
もしかすると、実験が根本的な勘違いをしてるのかもしれません。

投稿2017/04/17 11:47

kazuya_

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2017/04/17 12:18

F1.texyBox1.Text = Msg; これは直接実行しているのでtextBox1に値が入ります。 () => { F1.textBox1.Text = msg; } この時点では、「F1.textBox1.Text = msg;」このコードは実行されません。 ですから、msgに値が入っていようがtextBox1には入りません。 試しに // F1.textBox1.Text = msg; //TextBoxにfgfgfgがはいる return new Person(F1, msg, () => { F1.textBox1.Text = msg; });//TextBoxにfgfgfgがはいらない と書いて、F1.textBox1.Text = msg;の行にブレークポイントを置いても止まらないのを確認できると思います。 それで、 public Person(Form1 Ft, string St, Action Sa) { ft = Ft; st = St; sa = Sa; sa(); } とsaを実行するように書いてやれば、ブレークポイントで止まるのを確認できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問