お世話になります。
.NET C#で開発をしている初心者です。
親Form1のReadOnlyにしているtextBox1をダブルクリックしたら、子Form2が表れ、
その中で、ラジオボタンなどで各項目を選択する様になっており、選択した結果の
文字列が、子Form2のReadOnlyにしているtextBox1に表示され、これで良ければ、
決定ボタンであるButton1を押すと、子Form2が閉じられ、元の親Form1のReadOnly
にしているtextBox1に子Form2で決定した文字列が表示される様にしたいのですが、
私がやってうまく行かないのは、子Form2で決定した文字列をClassでsetし、親Form1
に制御が移った時に、classからgetしようとしたのですが、
まず、子Form2が閉じられた時、親Form1はtextBox1にダブルクリックしたままの(後の)
状態、つまりカーソルが残ってる状態で、文字列が表示されない。
子Form2が閉じられた時すぐかもしくは、子Form2の決定ボタンであるButton1を押した
時すぐに親Form1のtextBox1に文字列が表示されていて欲しいのですが、その方法が
分からないので、とりあえず、親Form1のtextBox1のLeaveイベントを発生させて文字列
を表示しています。
どなたかご親切な方、ご教授下さいます様、宜しくお願い申し上げます。
No.1
- 回答日時:
・親フォームのtextBox1の参照を子フォームに持たせておく
・子フォームが閉じられた、あるいはButton1を押したら参照を使って内容を更新
という流れですね。
なお、普通にこれだけ書くと通常設定ではエラーになります。
設定で回避することも不可能ではありませんが、デリゲートを使って親Formのスレッドで書くようにするのが普通です。
http://www.atmarkit.co.jp/fdotnet/dotnettips/312 …
ご回答頂きありがとうございます。
「参照を子フォームに持たせる」、「参照を使って内容を更新」とは
具体的にどの様にすれば良いのでしょうか。
差し支えなければお教え頂きたく宜しくお願いします。
No.2
- 回答日時:
まず子フォームのクラスメンバ変数にTextbox型の変数を追加します。
で、子フォームの作成時にでも親フォームから自身のtextBox1を渡してやり、子フォームでは上記メンバ変数に格納します。
上記で受け渡したものは参照として機能し、子フォームから親フォームのtextBox1を任意のタイミングで操作出来るようになります。
……って思ったんですが、よくよく考えると今回は別にtextBox1の参照持ってる必要はないですね。失礼しました。
親フォーム側に文字列型を投げるとtextBox1を変更するパブリックメンバ関数を用意しておいて、その中でデリゲートで処理を委譲するようにして子フォームからこのパブリックメンバ関数を呼べばいいです。
親フォーム側:
class parentForm {
// 記述追加
delegate ctlFromChild(string str);
public void changeTextBox1(string str)
{
Invoke(new ctlFromChild(changeTextBox1del(str)));
}
void changeTextBox1del(string str)
{
this.textBox1.text = str;
}
};
上記処理を追加しておいて、子フォームからは任意のタイミング(質問の場合は子フォームのOnCloseイベントハンドラ中)でparentForm.changeTextBox1を呼び出すことで親のtextBox1が書き換わります。
なんでこう書く必要があるのかは先に提示したURLを読んでください。
なお、複数のテキストボックスを汎用的に扱いたい場合は、最初に言ったように操作対象のコントロールの参照を持っておくとコードが共通化できて見通しが良くなります。
ご丁寧に有難うございます。
しかし、私のスキル不足のよりモジュールエラーが出ており、
何度も申し訳ございませんが、再度ご確認させて頂きたく、
宜しくお願い致します。
確認1
「delegate ctlFromChild(string str);」と
「Invoke(new ctlFromChild(changeTextBox1del(str)));」に
出てくる「ctlFromChild」は、実際の子フォーム名に置き換えて
良いのですよね。
確認2
「Invoke(new ctlFromChild(changeTextBox1del(str)));」
の「(changeTextBox1del(str)」の部分に赤い下波線が出ており、
メソッド名が必要です。と言うモジュールエラーが出てしまっています。
何かが間違い又は不足でしょうか。
確認3
子フォームの呼び出しのコードを下記の様に書いたのですが、
間違ってますでしょうか。「Form1.changeTextBox8(mojiretu)」
と言う所に赤い下波線が出てしまっていて、
「静的でないフィールド、メソッド、またはプロパティに含まれていないため、
コードの解析または生成をサポートしません。」と言うモジュールエラー
が出てしまっているのですが。
string mojiretu;
mojiretu = textBox1.Text;
Form1.changeTextBox8(mojiretu);
↑実際の親フォーム名 ↑実際の親フォームテキストボックス
No.3
- 回答日時:
ctlFromChildは「親フォーム内」に定義する「デリゲート」であってクラスではありませんから、「子フォーム名」に置き換えてはいけません。
まぁ同じにしてあれば何かと被らない限りはどんな名前にしてもいいんですが。#2での提示部分はそのまま使えるように書いたつもりなので、とりあえずは書き換えせずにやってみてください。
一方で「parentForm」については親フォーム名に置き換えてもらっていいというか、置き換えてもらわなければいけません。
お世話になっております。
何度もすみません。
そのまま記述追加致しましたが、
「delegate ctlFormChild(string str);」の「(」カッコの部分と、
「Invoke(new ctlFormChild(change・・・)」の「ctlFormChild」の
部分に赤い下波線が出てモジュールエラーとなってしまいました。
No.5
- 回答日時:
えーと、私も最近C#を使ってないので色々抜けてるようです。
静的関数ではないためにオブジェクトが要るので、引数changeTextBox1delの頭にthis.を付けてみてください。
それで駄目ならthisの代わりに親フォームの名前を。
お世話になっております。
すみません。先程の「静的な・・・」と言うエラーメッセージ内容は、
子Formの呼び出し側の方でした。
呼び出すメソッド名の頭に、親フォーム名を付けました。そうしましたら、
おそらく親Formの下記記述部分でエラーが出ている為に、
「アクセスできない保護レベルになっています。」と出ました。
親Formの
「Invoke(new ctlFromChild(changeTextBox1del(str)));」
のchangeTextBox1del(str)に赤い下波線が出ていたエラー内容は、
「メソッド名が必要です。」でした。
メソッドと思われていないと言う事でしょうか。
デリゲートって難しいですね。
No.6
- 回答日時:
難しいっつーか面倒なだけなんですけどね。
アクセス制限ということなら関数にpublic宣言が入ってないせいかとも思いますが、昨日別解を掘り起こしたので帰宅したらそちらのコードも提示しますね。
まぁ別解とは言っても、デリゲートを使ってるという点では一緒なんですが。
No.7
- 回答日時:
お待たせしました。
別解です。System.Threadingを使うので、別途using宣言してください。
デリゲート宣言からやりなおします。
private delegate void ctlFromChild();
public void changeTextBox1(string str)
{
new Thread(new ThreadStart(
delegate {
Invoke((ctlFromChild)delegate
{
textBox1.Text = str;
});
})).Start();
}
動いているコードから引っ張ってきたものなので、これならたぶん大丈夫じゃないかと。
いつもお世話になっております。
「 )がありません。」とエラーが出ていましたので、下記記述
「Invoke((ctlFromChild)(delegate
{
textBox8.Text = str;
});」
の中の最後に「}));」付け足しました。合っていますでしょうか。
また、
「new Thread(new TreadStart(delegate」の「TreadStart」部分に
赤い下波線が有り、「型または名前空間名 'TreadStart' が見つかりません
でした。using ディレクティブまたはアセンブリ参照が不足しています。」
と出ています。
今回「using System.Threading;」は追加しております。
どこが悪いでしょうか。
No.8
- 回答日時:
カッコの不足分についてはそれであってます。
というか欠けてましたか、すみません。
> 型または名前空間名 'TreadStart' が見つかりませんでした
先の回答で提示した該当部分は
> new ThreadStart
です。さて何が足りないでしょう?
No.9
- 回答日時:
……って違う。
自力でタイプするのはいいんですが、間違いなくやるようにしてください。
カッコのエラーは、こちらで提示したコードが
> Invoke((ctlFromChild)delegate
であるのに対して、エラーが出ているのは
> Invoke((ctlFromChild)(delegate
となると、delegate前の(を取るのが正しいです。
大変失礼いたしました。
delegate前の(は取りました。
> 型または名前空間名 'TreadStart' が見つかりませんでした
で何が足りないかは、「using System.Threading;」は追加しましたし、
何が足りないんだろう。
すいません、分かりません。
No.10
- 回答日時:
んー、#9でもタイプミスを指摘してるんですからそれを疑ってほしかった。
正直このレベルの確認を怠って「何故?」と聞かれるのは非常に悲しいです。
> new T"h"readStart
です。hが足らない。
大変お恥ずかしい限りでございます。
わたしも悲しくなってきました。
hを足した事で、親フォームのエラーはなくなりました。
最初の頃に頂きましたご回答で
>子フォームからは任意のタイミング(質問の場合は子フォームの
>OnCloseイベントハンドラ中)でparentForm.changeTextBox1を
>呼び出すことで親のtextBox1が書き換わります。
こうありましたが、、
子フォームから「 親フォーム名.changeTextBox1」 を呼び出して
もエラー(「静的でないフィールド、メソッド、・・・・で、
オブジェクトが必要です。」)になるのは、
今では記述内容が変わってしまったからでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
クリックイベントなのに、2回ク...
-
ユーザーフォーム上に現在日時...
-
ユーザーフォームのテキストボ...
-
エクセルVBAのフォームを最...
-
ACCESSキャンセル時の確認メッ...
-
ACCESSのフォーム、開くんです...
-
C#で起動時のフォームを非表示...
-
EXCEL ユーザーフォームのタイ...
-
MSGBOXのフォント大きさ変更
-
クリックするたびに、フォーム...
-
フォームウィンドウを最前面に...
-
特定のフォームが開いているか...
-
ContextMenuStripに追加したア...
-
VBA(エクセル)のユーザー...
-
Hideについて(.NET)
-
VBAでユーザーフォームを再表示...
-
ユーザーフォームのラベルに時...
-
ブックをCloseまたはQuitで閉じ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
クリックイベントなのに、2回ク...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームのテキストボ...
-
Microsoft Formsの「個人情報や...
-
ユーザーフォーム上に現在日時...
-
Form_Load と Form_Activate の...
-
モーダルフォームとモードレス...
-
Excelにて、ユーザーフォームで...
-
VBAでユーザーフォームを再表示...
-
【VBAユーザーフォームで閉じる...
-
MSGBOXのフォント大きさ変更
-
VBA(エクセル)のユーザー...
-
Hideについて(.NET)
-
エクセルVBAのフォームを最...
-
コントロールの存在確認
-
ACCESSのフォーム、開くんです...
-
'ユーザーフォーム右上隅の[×...
-
フォームウィンドウを最前面に...
-
ユーザーフォームのラベルに時...
おすすめ情報