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

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

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

Re[6]: C#の別フォームからの値取得について


(過去ログ 138 を表示中)

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

■81323 / inTopicNo.1)  C#の別フォームからの値取得について
  
□投稿者/ ぽん太郎 (10回)-(2016/09/07(Wed) 23:05:24)

分類:[C#] 

form1 form2などの別フォームのテキストに入力されている値などは取得できるのですが、
ユーザーコントロールからメインフォームにあるテキストの値も同じように取得できるのでしょうか?
ユーザーコントロールもformと同じような扱いでアクセスしてみたんですが、保護されてるとかでアクセスできずに困っています。

ユーザーコントロールとformはまったく別物なんでしょうか?

ご教授頂ければ幸いです。
引用返信 編集キー/
■81324 / inTopicNo.2)  Re[1]: C#の別フォームからの値取得について
□投稿者/ Azulean (707回)-(2016/09/07(Wed) 23:17:51)
2016/09/07(Wed) 23:27:46 編集(投稿者)

No81323 (ぽん太郎 さん) に返信
> form1 form2などの別フォームのテキストに入力されている値などは取得できるのですが、
> ユーザーコントロールからメインフォームにあるテキストの値も同じように取得できるのでしょうか?
> ユーザーコントロールもformと同じような扱いでアクセスしてみたんですが、保護されてるとかでアクセスできずに困っています。

ユーザーコントロール内のコントロールを選択して、Modifiers プロパティを確認してみてください。
Private になっていたら、Friend にするとフォーム上のコントロールと同じようになるかもしれません。

それではなさそうな場合、コード上で具体的にどの文字列がエラーになっているか、部分的にでもかまいませんので示してください。

' あるいは、Form1.△△ みたいにアクセスしてしまっているのかな?
' そうであれば、暗黙のインスタンスはフォームにしか通用しないと思うので、Form1.UserControl1.〇〇 というようにつなげて書くなど。
引用返信 編集キー/
■81325 / inTopicNo.3)  Re[2]: C#の別フォームからの値取得について
□投稿者/ ぽん太郎 (11回)-(2016/09/07(Wed) 23:32:31)
//private UserControl1 otherForm;
//private void a()
// {
// listBox2.Text = otherForm.listBox2.Text;
//}


これはユーザーコントロールからメインフォームにあるリストボックスの値を取得するやつなんですが、

//otherForm.listBox2.Textの部分のlistBox2の部分がエラー箇所で

アクセスできない保護レベルですと出ています。


引用返信 編集キー/
■81326 / inTopicNo.4)  Re[3]: C#の別フォームからの値取得について
□投稿者/ ぽん太郎 (12回)-(2016/09/07(Wed) 23:33:40)
なんか書き込みしようとしたら
ERROR-迷惑投稿者と判定されました。

って出てなんかNGワードとかあるんでしょうか?
引用返信 編集キー/
■81328 / inTopicNo.5)  Re[3]: C#の別フォームからの値取得について
□投稿者/ Azulean (708回)-(2016/09/08(Thu) 06:16:49)
2016/09/08(Thu) 06:17:35 編集(投稿者)

No81325 (ぽん太郎 さん) に返信
> //otherForm.listBox2.Textの部分のlistBox2の部分がエラー箇所で
>
> アクセスできない保護レベルですと出ています。

(なぜか VB だと思い込んでいて)
先の書き込みで間違えていましたが、Modifiers が Internal や Public じゃないと外側からアクセスできません。
が、個人的にはその解決方法はやめておいた方がいいと考えています。


C# ではデフォルトで自分以外はアクセスできないという Private がデフォルトになっています。
これは不必要にフィールド変数を晒さないという思想からです。

また、ユーザーコントロールは画面とセットで機能を提供するものだと考えています。
ユーザーコントロールが listBox2 を持っていて、それがどんなものかという細かいことを利用者が把握するより、UserName みたいなプロパティで公開する方がわかりやすいです。

例: public string UserName { get { return listBox2.Text; } }

こうすることで、ユーザーコントロールの利用者は listBox2 といった具体的な内部の名前を知らなくて済みます。
また、ユーザーコントロール側のデザインや実装を変えることができます。
たとえば、ListBox から ListView に置き換えても、UserName の実装さえちゃんと変えてあげれば、ユーザーコントロールを利用する側のフォームを変更する必要がなくなります。

一般的には「カプセル化」といったキーワードで知られている話ですので、一度、学んでいただいた方が良いかと思います。


// NG ワードはあるらしいですが、非公開です。
引用返信 編集キー/
■81358 / inTopicNo.6)  Re[4]: C#の別フォームからの値取得について
□投稿者/ ぽん太郎 (13回)-(2016/09/10(Sat) 23:14:05)
回答ありがとうございます。
教えていただいた内容が難しくて理解できなくて、別の方法を探していたところ


Control[] Co = this.TopLevelControl.Controls.Find("textBox8", true);
Co[0].Text = "aa"

TopLevelControlで親フォームのコントロールを取得できるみたいなんですが、textBoxをListBoxにかえても上手くいかないです。


TopLevelControlを使ってユーザーコントロールから親フォームの選択してる行のテキストの値は取得すること可能でしょうか?

ここ数日ずっと調べてました。日本のサイトから海外のフォーラムまで・・・
form form2とかのデータの受け渡しとかは調べたらすぐでてくるのですが、ユーザーコントロールからformにあるコントロールの値取得などは参考サイトが少ないです・・・

引用返信 編集キー/
■81361 / inTopicNo.7)  Re[5]: C#の別フォームからの値取得について
□投稿者/ Azulean (710回)-(2016/09/11(Sun) 04:55:41)
2016/09/11(Sun) 05:05:31 編集(投稿者)
No81358 (ぽん太郎 さん) に返信
> ここ数日ずっと調べてました。日本のサイトから海外のフォーラムまで・・・
> form form2とかのデータの受け渡しとかは調べたらすぐでてくるのですが、ユーザーコントロールから
> formにあるコントロールの値取得などは参考サイトが少ないです・・・

目的ベースで探しても見つからない類いの話だと思います。
(でも、フォーム間の受け渡しと同じ考え方のはずですけれども…)

おすすめしない、安易な解決は先ほども書きましたがもう少し砕くと:
1.ユーザーコントロールのデザイン画面を開く。
2.外から触りたい貼り付けているコントロールを選択する。
3.プロパティから Modifiers を探す。
4.Private になっているものを Internal や Public に変更する。


どちらかと言えば、プロパティを作るべきです。
ユーザーコントロール側のコードエディターを開き:

// ユーザーコントロールのプロパティとして公開する
public ListBox1Text {
  get { return listBox1.Text; }
  set { listBox1.Text = value; }
}

そして、利用するフォーム側で:

// 自作したプロパティを利用する
otherForm.ListBox1Text = "aa";

という感じです。
今回はサンプルとしてコントロールの名前そのものにしましたが、コントロールの名前もプロパティの名前も
意味を持たせた方が良いです。
ユーザー名を表示する、設定するのであれば UserName、ファイル名であれば FileName などと、
意味のある名前をつけないと、たくさんコントロールを配置したときに何番だっけ?となってしまうためです。

自作のプロパティに関しては DOBON.NET さんの記事も読んでおきましょう。
http://dobon.net/vb/dotnet/vb6/property.html

-----
追伸
フォームや otherForm と書いていますが、ユーザーコントロールはフォームではありません。
コミュニケーションの際にも勘違いを誘発することになるので言葉は使い分けましょう。

引用返信 編集キー/
■81367 / inTopicNo.8)  Re[6]: C#の別フォームからの値取得について
□投稿者/ ぽん太郎 (14回)-(2016/09/11(Sun) 22:40:08)
詳しい解説ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -