初めての店舗開業を成功させよう>>

お世話になります。

.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イベントを発生させて文字列
を表示しています。

どなたかご親切な方、ご教授下さいます様、宜しくお願い申し上げます。

A 回答 (11件中11~11件)

・親フォームのtextBox1の参照を子フォームに持たせておく


・子フォームが閉じられた、あるいはButton1を押したら参照を使って内容を更新
という流れですね。

なお、普通にこれだけ書くと通常設定ではエラーになります。
設定で回避することも不可能ではありませんが、デリゲートを使って親Formのスレッドで書くようにするのが普通です。
http://www.atmarkit.co.jp/fdotnet/dotnettips/312 …
    • good
    • 0
この回答へのお礼

ご回答頂きありがとうございます。

「参照を子フォームに持たせる」、「参照を使って内容を更新」とは
具体的にどの様にすれば良いのでしょうか。

差し支えなければお教え頂きたく宜しくお願いします。

お礼日時:2010/11/20 21:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?

Q別のフォームで記述している関数を実行するには?C#

お世話になります。ド素人な質問ですみません。
C#なのですが例えばForm1で記述した関数(関数って呼ぶのかわかりませんが)をForm2で実行するにはどのようにしたらよいのでしょうか?
ネットで検索してみてもなかなかヒットしないのでこちらでお聞きします。

public partial class Form1 : Form
{
 public Form_OzzCalc()
 {
 InitializeComponent();
 }
 
 private void hoge()
 {
 ~
 }
}

このhoge()という関数を別のフォーム(例えばForm2)で呼び出して使うにはどのようにしたらよいのでしょうか?
privateをpublicに変更してもForm2ではこの関数を記述すると「'hoge'は現在のコンテキスト内に存在しません」と出ます。
何か参考になるサイトでも構いません。よろしくお願いいたします。

Aベストアンサー

この記述方法ですとForm1のインスタンス経由で関数を実行します

Form2側からですと

((Form1)Application.OpenForms["Form1"]).hoge();
といった具合です


下のように Form1クラスにスタティック(静的)関数を作成すれば
public static void foo()
{
}

Form2側からは
Form1.foo();
といった具合で実行できます

MessageBoxのShowがこの静的実装がされています

Qアクセスできない保護レベルエラーが発生します

VB or C#についてお教え下さい。環境はVS2010です。

フォーム(Form1)にテキストボックス(txtBOX)があります。

このFormのtxtBOXに対して文字列を入力するには、

this.txtBOX.text = "こんにちは";
または
Me.txtBOX.text = "こんにちは";

というように、やるのは理解できます。

Classを追加して、このクラス(CLASS1)からForm1のテキストボックスに文字列を入力したいと思います。

そこで、
Form1 f1 = new Form1();
f1.txtBOX.text = "こんにちは";

とやりたかったのですが、そもそもインテリセンスが効きません。さらに、ビルドすると、

「Form1.txtBOXはアクセスできない保護レベルになっています。」と表示がされます・・・

いったい何が悪く、どこを直せば解決するのでしょうか?

Aベストアンサー

publicやprivate, protectedの違いは理解しておられますか?
まだなら、先にそれらの学習をしてください。

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

Qラジオボタンの初期指定

ラジオボタンを12個使用する画面を今作っているのですが、初期立ち上げ時に1番目のラジオボタンを選択した状態にするのはどうすれば良いのでしょうか?

プログラムの流れ上選んでいなくても、1番目を選んだ状態に次のウィンドウは開くのですが、聞く話で、それは不安定要素があるって聞いた物ですから。

Aベストアンサー

VB.NETだったら
デザイン時に
Checkedをtrue

QC#での動的配列作成方法について

はじめまして、

現在ASP.NET、C#で開発をしております。
そこで、質問です。

C#で二次元配列を作成し、データを格納します。
二次元配列は宣言時はサイズがわかってません。
ループで回った回数分、最初(第一要素数)の要素数が決定します。
二つ目の要素数の数は最初からきまっています(固定用素数)。

string[][]
string[,]
arraylist
などがあると思いますが、上記の場合どういう風に配列を作成していったらいいのでしょうか?
動的にサイズを変更できる配列の作り方、データ格納方法、データ表示方法を教えてください。

よろしくお願いします。

Aベストアンサー

//例えば、こんな感じ
using System;
using System.Collections;
public class SamplesArrayList {

public static void Main() {

ArrayList aArrayList = new ArrayList();
for(int i=0;i<10;i++){
aArrayList.Add(new int[5]); // ArrayListへの追加(intに限らない)
for(int j=0;j<5;j++){
((int[])aArrayList[i])[j]=i+j;// 値のセット
}
}
// 表示
Console.WriteLine( "aArrayList" );
Console.Write( "データ数:{0}\n", aArrayList.Count );
for(int i=0;i<aArrayList.Count;i++){
Console.Write( "\nデータ[{0}]:\n\t",i);
for(int j=0;j<5;j++){
Console.Write("[{0}]", ((int[])aArrayList[i])[j] );
}
}
}
}
ArrayListを使うことで動的な配列を作成できます。
サンプルでは、回数が決まっていますが、回数のループが決まっていない時にも、使えるのは明白です。
ArrayListには、addメソッドを使ってオブジェクトという形でなんでも格納できます(サンプルではintの配列)アクセスには、[]が使えます。詳しくは、ヘルプを参照して下さい。

//例えば、こんな感じ
using System;
using System.Collections;
public class SamplesArrayList {

public static void Main() {

ArrayList aArrayList = new ArrayList();
for(int i=0;i<10;i++){
aArrayList.Add(new int[5]); // ArrayListへの追加(intに限らない)
for(int j=0;j<5;j++){
((int[])aArrayList[i])[j]=i+j;// 値のセット
}
}
// 表示
Console.WriteLine( "aArrayList" );
Console.Wri...続きを読む

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QC# 計算処理中に実行中ウィンドウを表示させたい。

アドバイスをお願いいたします。

やりたいこと:
(1)メインウィンドウで「計算始めるボタン」を押す。
(2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。
(3)計算が終わると別ウィンドウが閉じる。

下記プログラムの不具合:
別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。

注意: 
下記プログラムはAthlon3000+で1秒ほどかかります。
CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。

using System;
using System.Drawing;
using System.Windows.Forms;

//メインウィンドウ
public class MainForm : Form {
private Button button;
private Label label;
public MainForm() {
button = new Button();
button.Text = "計算GO!!";
button.Click += new System.EventHandler(button_click);
label = new Label();
label.Location = new Point(50,50);
label.Text = "メインウィンドウ!";
Controls.Add(button);
Controls.Add(label);
Text = "MainForm";
BackColor = Color.Blue;
}

static void Main() {
Application.Run(new MainForm());
}

//計算GOボタンをクリックした時の処理
private void button_click(object sender, System.EventArgs e) {
double z;
SubForm Sub = new SubForm();

Sub.Show();

//計算処理
for(int i=0; i<=500000000; i++)
z = double.MaxValue * double.MinValue;

Sub.Close();

MessageBox.Show("計算終了");
}
}

//計算中を通知するウィンドウ
public class SubForm : Form {
private Label label;
public SubForm(){
label = new Label();
label.Text = "実行中!";
label.Location = new Point(50,50);
Text = "計算中通知ウィンドウ";
BackColor = Color.Red;
Controls.Add(label);
}
}

アドバイスをお願いいたします。

やりたいこと:
(1)メインウィンドウで「計算始めるボタン」を押す。
(2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。
(3)計算が終わると別ウィンドウが閉じる。

下記プログラムの不具合:
別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。

注意: 
下記プログラムはAthlon3000+で1秒ほどかかります。
CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。

using System;
using S...続きを読む

Aベストアンサー

このような場合はマルチスレッドにするのが常套手段だと思います。

例えば、ボタン押した時にウインドウを作成表示し、計算スレッドを起動。計算スレッドの終了時にウインドウを閉じるのような動作にします。
逆に、Formの方を新規のスレッドにする手もありますが。

WIN32 API呼び出すより楽です。

[HOWTO] Visual C# .NET を使用してスレッドを作成する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;815804

C#プログラミング入門 第7回:マルチスレッドプログラミング
http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp

参考URL:http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。


人気Q&Aランキング

おすすめ情報