C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ダイアログを使ったメインフォームオブジェクトの書き換え


(過去ログ 123 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■73597 / inTopicNo.1)  ダイアログを使ったメインフォームオブジェクトの書き換え
  
□投稿者/ pod (21回)-(2014/10/15(Wed) 10:57:27)

分類:[.NET 全般] 

メインフォームにラベルがあり、クリックすると編集用のダイアログが表示され、
OKボタンを押すとダイアログの入力内容がラベルのテキストとして
設定されるといった場合、書き換え処理はどちらのオブジェクトから
行うべきでしょうか?

思いつくのはダイアログ側のTextBoxをpublicにし、OKボタンのイベントを

this.DialogResult = DialogResult.OK;

に設定するだけにして、
あとはメインフォーム側でDialogResult.OKであれば

label.Text = dialog.textBox.Text;

のようにして書き換えるか、
メインフォームのラベルをpublicにし、ダイアログのOKボタンイベントで

this.Owner.label.Text = this.textBox.Text;

として書き換えるパターンが有ると思います。

初歩的な質問ですが実際にはどのような方法を取るのが一般的でしょうか?
C#を使っていますが手順がわかれば言語は問いません。
宜しくお願い致します。
引用返信 編集キー/
■73598 / inTopicNo.2)  Re[1]: ダイアログを使ったメインフォームオブジェクトの書き換え
□投稿者/ 魔界の仮面弁士 (148回)-(2014/10/15(Wed) 11:13:04)
2014/10/15(Wed) 11:34:25 編集(投稿者)

No73597 (pod さん) に返信
> メインフォームにラベルがあり、クリックすると編集用のダイアログが表示され、
> OKボタンを押すとダイアログの入力内容がラベルのテキストとして
> 設定されるといった場合、書き換え処理はどちらのオブジェクトから
> 行うべきでしょうか?

ダイアログ側は、呼び出し側を一切操作しないのが一般的です。
また、ダイアログのコントロールを呼び出し側が直接操作することもありません。

ダイアログ上の TextBox を操作するのはダイアログ自身ですし、
フォーム上の Label を操作するのはフォーム自身に限られます。基本的には。


> 思いつくのはダイアログ側のTextBoxをpublicにし、
private から public に広げるのは NG ですね。
制限の甘い VB ですら、初期設定は protected 相当(Friend)ですよ。


> label.Text = dialog.textBox.Text;
dialog が form1.label1.Text にアクセスするのも、
form1 が dialog.textBox1.Text にアクセスするのも NG です。

直接コントロールを公開してしまうと、外部から、そのコントロールの
位置・色・フォント・可視・使用可否などのプロパティ設定を
操作できてしまうことに繋がります。カプセル化の観点からも避けましょう。


この場合は、dialog 側に「入力値を返すプロパティ」を用意するべきです。
OpenFileDialog の FileName/FileNames プロパティや
FontDialog の Font プロパティなどのように。

あるいは、ダイアログが閉じた時にその値を受け渡すようにするのではなく、
ダイアログ上での入力中に、その値をリアルタイムに呼び出し元に伝えるため、
「イベント」を利用するパターンもあります。(例:FontDialog.Apply イベント)
引用返信 編集キー/
■73602 / inTopicNo.3)  Re[2]: ダイアログを使ったメインフォームオブジェクトの書き換え
□投稿者/ pod (22回)-(2014/10/15(Wed) 12:40:52)
2014/10/15(Wed) 12:43:00 編集(投稿者)
2014/10/15(Wed) 12:42:56 編集(投稿者)
No73598 (魔界の仮面弁士 さん) に返信
> 2014/10/15(Wed) 11:34:25 編集(投稿者)
>
> この場合は、dialog 側に「入力値を返すプロパティ」を用意するべきです。
> OpenFileDialog の FileName/FileNames プロパティや
> FontDialog の Font プロパティなどのように。

回答有難うございます。
ダイアログ側に専用のプロパティを持たせてフォーム側から読み取るのが一般的なんですね。
その際のプロパティについて追加でいくつか質問させていただきたいのですが、
編集用ダイアログに持たせるプロパティ名を仮に「DialogText」とした場合、

public string DialogText { get; private set; }

のようにするものと、

private string dialogText;
public string DialogText {
get { return this.dialogText; }
private set { this.dialogText = value; }
}

のようにする物があるようですが、今回のケースでは上で良いのでしょうか?
また、テキストボックスの内容が空であった時に警告ダイアログを出させるケースでは
OKボタンのイベント内で直接内容をチェックするか、(textBox.Text == String.Empty)
一度DialogTextにセットを試み、その際に例外を投げるように設計すべきでしょうか?

private set
{
if(value == String.Empty) throw new Exception("文字列が空です");
this.dialogText = value;
}
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -