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

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

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

Re[4]: 違うフォームに配置された同名コントロールの扱い


(過去ログ 61 を表示中)

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

■35088 / inTopicNo.1)  違うフォームに配置された同名コントロールの扱い
  
□投稿者/ プリ太 (3回)-(2009/04/20(Mon) 09:30:51)

分類:[C#] 

環境WinXP VS2005です。

出来るのかどうかを教えてください。

現在、フォームAとBに同じ名前のコントロールをいくつか配置しています。
このフォームAとBは親フォームから呼び出されますが、条件によってどちらを呼び出すかが決まります。

今は、親フォームから呼び出すAのフォームに値を設定する場合、
FormA nA = new FormA();
nA.Label.Text = "Label";
nA.Button.Text = "OK";
とし、フォームBに値を設定する場合は、
FormB nB = new FormB();
nB.Label.Text = "Label";
nB.Button.Text = "OK";
としています。
これだと、宣言以外の部分はフォーム名が違うだけで同じコードを記載することになります。

宣言をまとめるのはムリだと思うのですが、
そのあとのコードをまとめることはできるのでしょうか?

また、ほかのクラスからフォームAとBのコントロールの値を設定する場合も、まとめることはできるのでしょうか?

よろしくおねがいします。
引用返信 編集キー/
■35089 / inTopicNo.2)  Re[1]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ .SHO (796回)-(2009/04/20(Mon) 09:37:11)
FormAB nA = new FormAB();
FormAB nB = new FormAB();

じゃダメ?

引用返信 編集キー/
■35090 / inTopicNo.3)  Re[2]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ επιστημη (1894回)-(2009/04/20(Mon) 09:52:11)
επιστημη さんの Web サイト
public interface ICommon {
  Label TheLabel { get; }
  Button TheButton { get; }
}

を用意し、FormA/FormBで

public partial class Form# : Form, ICommon {
  public Label TheLabel {
    get { return this.label1; }
  }
  public Button TheButton {
    get { return this.button1; }
  }
  ...
}

ってやっとけば FormA,FormB に共通のinterfaceを持たせられます。

FormA nA = new FormA();
FormB nB = new FormB();

ICommon c;
c = nA か nB のどっちか
c.TheLabel.Text = "Label";
c.TheButton.Text = "OK";

引用返信 編集キー/
■35091 / inTopicNo.4)  Re[1]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ よねKEN (320回)-(2009/04/20(Mon) 10:18:33)
> 現在、フォームAとBに同じ名前のコントロールをいくつか配置しています。
> このフォームAとBは親フォームから呼び出されますが、条件によってどちらを呼び出すかが決まります。

このフォームAとBの役割、関係性、類似点などの意味づけによって設計が変わると思うので、
ご質問内容を出発点としてコメントするのは難しいですね。

> 今は、親フォームから呼び出すAのフォームに値を設定する場合、
> FormA nA = new FormA();
> nA.Label.Text = "Label";
> nA.Button.Text = "OK";
> とし、フォームBに値を設定する場合は、
> FormB nB = new FormB();
> nB.Label.Text = "Label";
> nB.Button.Text = "OK";
> としています。

例えば、そのラベルやボタンが全フォームに共通で配置するような設計になっているのであれば、
SHO.さんのコメントのように継承元フォームに持たせるという方法があるでしょう。

あるいは、全フォームに共通ではないけれど、FormA、FormBには共通で意味的には同じものであるならば、
そのラベルとボタンをまとめたユーザコントロールを作る方が適切かもしれません。
(そして、ユーザコントロールとして、一括でセットするためのメソッドを提供するといった方法が考えられます)

> そのあとのコードをまとめることはできるのでしょうか?

継承元フォームを持たない場合でも、επιστημηさんのご提示されているように
interfaceを使えばまとめることはできます。interfaceの定義としては、
επιστημηさん方式のようにラベルとボタンを公開する以外に、
「ラベルとボタンの名称をセットするためのメソッド」を公開する手もあるでしょう。

引用返信 編集キー/
■35092 / inTopicNo.5)  Re[3]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ 倉田 有大 (572回)-(2009/04/20(Mon) 10:19:03)
class commonForm : Form {}
class Form1 : commonForm {}
class Form2 : commonForm {}
とか、いろいろやり方ありそう。(インターフェースの方が美しいかな)

C#の継承について調べると幸せになれるかと。
順番は、クラスの継承→インターフェースの継承? 僕はこの順番で学習。
引用返信 編集キー/
■35102 / inTopicNo.6)  Re[2]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ プリ太 (4回)-(2009/04/20(Mon) 14:50:24)
みなさん、ありがとうございます。

フォームAはデータ表示のみ用、フォームBは編集&表示用のフォームとして考えています。
親フォームから呼び出す際に、読み取り専用の場合はフォームA、その他の場合はフォームBを呼び出します。
現在AとBには継承の関係はありません。
AとBでデータのやり取りもありません。
データは主にDataGridViewコントロールに表示しています。

共通のコントロールだけの継承元フォームを作成して、それを継承する方法も考えたのですが、
それだと他のクラスからフォームAとBのコントロールの値を設定する場合、
別々にコードを書かないとダメだったので、行き詰っていました。


> 継承元フォームを持たない場合でも、επιστημηさんのご提示されているように
> interfaceを使えばまとめることはできます。interfaceの定義としては、
> επιστημηさん方式のようにラベルとボタンを公開する以外に、
> 「ラベルとボタンの名称をセットするためのメソッド」を公開する手もあるでしょう。

interfaceを使うと、まとめられるということですか。
επιστημηさんの記載されているコードだとすっきりまとめられそうな気がします。
#ほぼ同じコードがまるっとあるのが見栄え的にイヤだったのです。
まずはinterfaceについて勉強してみます。

ありがとうございました。
引用返信 編集キー/
■35156 / inTopicNo.7)  Re[3]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ プリ太 (5回)-(2009/04/21(Tue) 13:26:05)
すみません、解決にチェックを入れずに投稿していたようです。

interfaceは勉強中です。
問題が発生したらよろしくおねがいします。
引用返信 編集キー/
■35158 / inTopicNo.8)  Re[4]: 違うフォームに配置された同名コントロールの扱い
□投稿者/ プリ太 (6回)-(2009/04/21(Tue) 13:26:50)
すみません、解決にチェックを入れずに投稿していたようです。
#しかも入れようと思い、また間違えました。

interfaceは勉強中です。
問題が発生したらよろしくおねがいします。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -