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

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

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

Re[5]: アクティブな MDI 子ウィンドウへのデータ送信


(過去ログ 112 を表示中)

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

■66178 / inTopicNo.1)  アクティブな MDI 子ウィンドウへのデータ送信
  
□投稿者/ 中学3年A (5回)-(2013/04/06(Sat) 11:05:02)

分類:[C#] 

開発環境:Vista
使用言語:Expres 2008 C#

アクティブな MDI 子ウィンド(Panelコントロール内のコントロール)ウへデータを送信するには。

SplitContainer(SplitContainer1) コントロールを垂直方向に配置し、左パネルのSplitContainer1.Panel1
にWindows.Forms.Panel(Panel1)を配置し、Panel1 コントロール内にLabelコントロール(Label1)配置してい
ます。
ここでの質問は、Panel1内のLabel1コントロールを特定する方法です。
宜しくお願いします。
なを、SplitContainer1.Panel1に直接Labelコントロール(Label1)を配置した場合は次の様な方法で
特定可能でした。
Form activeChild =this.ParentForm.ActiveMdiChild;
SplitContainer theContainer = (SplitContainer)activeChild.ActiveControl;
if (activeChild != null)
{
   try
   {
  for (int i = 0; i < theContainer.Panel1.Controls.Count; i++)
{
 if (theContainer.Panel1.Controls[i] is Label)
{
 gtheLabel = (Label)theContainer.Panel1.Controls[i];
 break;
  }
}
   catch(System.Exception exp)
   {
MessageBox.Show("You need to select a Label.");
   }
}
引用返信 編集キー/
■66181 / inTopicNo.2)  Re[1]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ shu (268回)-(2013/04/06(Sat) 22:43:24)
No66178 (中学3年A さん) に返信

なぜ特定出来ないのかが分かりませんが
動的にLabelを作成し特定が難しい場合は
Labelを作成したときに特定出来るように対応する情報を
持つようにするとよいです。
引用返信 編集キー/
■66182 / inTopicNo.3)  Re[1]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ Azulean (125回)-(2013/04/06(Sat) 23:03:03)
No66178 (中学3年A さん) に返信
> なを、SplitContainer1.Panel1に直接Labelコントロール(Label1)を配置した場合は次の様な方法で
> 特定可能でした。

同じ考え方なら、SplitContainer.Panel1 の Controls から Panel を探し、さらにその Panel の Controls から Label を探すことです。
ただ、ここまで相手の構造に依存しているなら、Form2 などの具体的な型にキャストして使った方がいくらかましです。

フィールド変数の Modifiers を public にするとか、Label を返すプロパティを作るとか、そういった方法で公開して


たとえば:
public partial class SampleForm : Form
{
  public Label InnerLabel { return label1; }
}

SampleForm activeChild = this.ParentForm.ActiveMdiChild as SampleForm;
if (activeChild == null) return;
activeChild.InnerLabel.Text = "Hello!";

引用返信 編集キー/
■66188 / inTopicNo.4)  Re[2]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ 中学3年A (6回)-(2013/04/07(Sun) 13:39:54)
No66182 (Azulean さん) に返信
 ご教授有難うございました。
> おかげさまで、次の様な方法でLabelコントロールを特定できました。
 
>> Form activeChild = this.ParentForm.ActiveMdiChild;
SplitContainer theContainer = (SplitContainer)activeChild.ActiveControl;
if (activeChild != null)
{
try
{
for (int i = 0; i < theContainer.Panel1.Controls.Count; i++)
{
if (theContainer.Panel1.Controls[i] is Panel)
{
thePanel = (Panel)theContainer.Panel1.Controls[i];
if (thePanel.Controls[i] is Label)
{
theLabel =(Label) thePanel.Controls[i];
break;
}
}
}

}
catch
{
MessageBox.Show("GetTheLabel");
}
}
解決済み
引用返信 編集キー/
■66190 / inTopicNo.5)  Re[3]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ Azulean (126回)-(2013/04/07(Sun) 17:45:34)
それで今は解決するかもしれませんが、私がなぜ「いくらかマシです」と書いたのかを今後考えてみてください。
今回の事例では以下のような点が懸念されます。

・Label を増やすようなデザイン変更が入ったとき、あなたのそのコードではどちらの Label が検出されるのか、不確かではありませんか。
 (列挙される順番にある程度決まりはあるので、不確かとは言い切れないかもしれませんが、壊れやすいと言う意味では同じ)
・Label を今の Panel から別の Panel に移す必要が出たとき、上記のコードはコンパイルエラーにはなりませんが、実行時に例外が発生するか、期待したとおりに動かないでしょう。

このように、相手の構造に依存していると、その構造が変わったときにすぐに壊れます。(不具合を招く)
個人の趣味の範囲では起きづらいかもしれませんが、画面の構造変更はよくある話ですので、どう作ると変更がしやすくなるかも考えてみてください。

-----

思ったんですが、theLabel =(Label) thePanel.Controls[i]; の行は論理的に正しくありません。
i がどのような変数の値を推移するか一度考えてみた方がよいでしょう。
Panel1.Controls[0] を見てるときは thePanel.Controls[0]、Panel1.Controls[1] を見てるときは thePanel.Controls[1] を見るので、thePanel.Controls の中を探し切れていません。。。
解決済み
引用返信 編集キー/
■66355 / inTopicNo.6)  Re[4]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ 中学3年A (7回)-(2013/04/17(Wed) 14:44:58)
No66190 (Azulean さん) に返信
> ご指摘の通り、複数のpanelにそれぞれ複数のlabelがある場合には、
前期のコードでは全く無力です。
今後、固有のpanel名(panel1,panel2....)及び固有のlabel名(label1,label2....)
を特定できるように、一般化したいと考えています。
どうも有難うございました。
引用返信 編集キー/
■66416 / inTopicNo.7)  Re[5]: アクティブな MDI 子ウィンドウへのデータ送信
□投稿者/ 中学3年A (8回)-(2013/04/22(Mon) 14:18:39)
No66355 (中学3年A さん) に返信
> ■No66190 (Azulean さん) に返信
>>ご指摘の通り、複数のpanelにそれぞれ複数のlabelがある場合には、
> 前期のコードでは全く無力です。
> 今後、固有のpanel名(panel1,panel2....)及び固有のlabel名(label1,label2....)
> を特定できるように、一般化したいと考えています。
> どうも有難うございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -