質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

Q&A

解決済

4回答

4307閲覧

Visual Studioで作成されたプログラム(C#)のテキストボックスの値について

nodact

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

0グッド

1クリップ

投稿2017/11/26 14:30

編集2017/11/27 00:23

質問を見ていただいてありがとうございます。
当方、Visual Studio、c#は初心者です。
会社の方針により、参考書を読みながら作成しております。
Cの基本がわかる程度です。よろしくお願いいたします。

さて、早速ですが掲題の件です。
現在、既存のプログラムの修正をしていたのですが、
調べてもわからなかったので質問させていただきます。

プログラムの内容
大まかな説明になりますが(今回必要ないところは端折らせていただきます)、
Visual Studioで作成されたソフトがあります。
起動するとウィンドウが表示され、テキストボックス1と2とボタン1つが
ある画面(windowとコメントがありました。.xamalでできてます)
で、テキスト1に数値を入力してボタンを押すとテキスト2に結果が
表示されるというものです。

構成
Visual Studioのソリューションエクスプローラーでみると
TESTという大きなくくり(C#)の中に
-App.config
-app.manifest
-App.xaml
-Window.xaml
-maincode.cs(C#)
とそれぞれがあります。
部品はテキストボックス1.2とボタン1です。
Window.xamlの中には
-Window.xaml.cs
があります。

やりたいこと
maincode.csの中で、テキストボックス1に入力されている値を
使いたい時があるのでその値を取得したい。

普通に読み込めるのかと思い、maincode.csで
strint ans = textbox1.Text;
とやったところ、
「CS0103:現在のコンテキストにtextbox1という名前は存在しません。」
となりました。

質問なのですが、
上記のやりたいことはそもそも可能なのでしょうか?

勉強不足で申し訳ございませんが、ご教示の程よろしくお願い致します。

補足
結構省略していますが、必要だと思われるところを抜粋しました。
必要なことが抜けていたらすいません。

Window.xaml.csの中身

C#

1namespace TEST 2{ 3 4 public partial class MainWindow : Window 5 { 6 private readonly Maincode maincode = new Maincode(); 7 public MainWindow() 8 { 9 InitializeComponent(); 10 maincode .TextBoxAdd = text_add; 11 12 } 13 private void text_add(string text) 14 { 15 this.textbox2.Dispatcher.BeginInvoke( 16 new Action(() => { 17 textbox2.Text = text; 18 })); 19 } 20 } 21}

maincode.csの中身

C#

1namespace Maincode 2{ 3 class Maincode 4 { 5 public Action<string> TextBoxAdd;// ログ出力用 6 7 public void Start() 8 { 9 ---色々処理省略--- 10 string text = System.Text.Encoding.UTF8.GetBytes("Date"); 11 TextBoxAdd(text); 12 13 var ans = textbox1.Text; ←これはエラー 14 } 15 } 16}

のようになっていて、maincoceからは、xamlのほうに値を渡して処理ができています。
逆に吸い出すのをやりたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/11/27 02:16

Start()はどこで呼ばれますか?MainWindow?
nodact

2017/11/28 02:51

>ozwk様 はい。MainWindowです。
guest

回答4

0

ベストアンサー

場当たり的な対応でよければ、以下のコードで動作しませんか?
一度C#の書籍を買って基礎的な部分について学習されてみてはいかがでしょうか。

Window.xaml.cs

C#

1private readonly Maincode maincode; 2public MainWindow() 3{ 4 InitializeComponent(); 5 // Maincode側にMainWindowの参照を保持 6 maincode = new Maincode(this); 7 maincode .TextBoxAdd = text_add; 8}

Maincode.cs

C#

1 class Maincode 2 { 3 public Action<string> TextBoxAdd;// ログ出力用 4     private readonly MainWindow window; 5 //コンストラクタを定義 6 public Maincode(MainWindow window) 7 { 8 this.window = window; 9 } 10 public void Start() 11 { 12 //省略 13 var ans = this.window.textbox1.Text; 14 }

□補足情報
MainWindowとMaincodeは所属しているクラスが違います。
所属しているクラスが違うので、MaincodeからMainWindowのインスタンスを使用せずにMainWindowが保持しているtextbox1.Text;へはアクセスできません。

他の方法としてはMainWindowのtextbox1.Textが変更されたことをイベントでMaincodeに通知するという手があります。

投稿2017/11/27 01:53

編集2017/11/28 06:13
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nodact

2017/11/28 03:07

ご回答いただきましてありがとうございます。 参考書は購入して並列で勉強中です。やりながら覚える形になってしまってます。 上記コードを試してみたところ、次のようなエラーが発生しました。 箇所としては、Window.xaml.cs側のmaincode = new Maincode(this);です。 CS1729 ’Maincode'niha、引数1を指定するコンストラクターは含まれていません。 補足もいただきましてありがとうございます。 クラスの違いが原因だったのですね。勉強不足ですいません。
umyu

2017/11/28 03:26

大変ですが、がんばってくださいな。 エラーメッセージを見る限りでは、Maincode.csに回答文のコンストラクタpublic Maincode(MainWindow window)が定義されていないように見受けられます。
nodact

2017/11/28 03:34

おっしゃる通りでした、誤字がありました。 すいません、次は別のエラーが発生しました。 CS1519 クラス、構造体、またはインターフェイス メンバーの宣言でトークン ';' が無効です。 場所はprivate readonly Maincode;の部分になります。 私の浅い知識で最初は private readonly Maincode maincode = new Maincode(this); としてたところ cs0027 キーワード’this'は現在のコンテキストでは使用できません。 とのエラーが出てきました。
umyu

2017/11/28 03:36

えっと回答文のコードをみてくださいな。
nodact

2017/11/28 03:42

ご回答いただいた通りにしているのですが CS1519のほうのエラーが消えないです。 根本的に私が間違っているのでしょうか?
umyu

2017/11/28 03:46

ごめんなさい、回答文が間違ってました、申し訳ないです。↓のコードに変更するとどうなりますか。 private readonly Maincode maincode;
nodact

2017/11/28 03:49

実行段階まで行けました! しかし、var ans = this.window.textbox1.Text; の箇所でエラー停止してしまいました。 このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。 System.InvalidOperationException となっておりました。 これは何が原因なのでしょうか?
umyu

2017/11/28 03:55

>このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。 System.InvalidOperationException えっと、Start()メソッドは、MainWindowから呼びされているんですよね?
nodact

2017/11/28 04:04 編集

はいそうです。 別の箇所では、下記のようにアクセスしていました。 こういった記述がたりないのでしょうか? this.textbox1.Dispatcher.BeginInvoke( new Action(() => { textbox1.Text=text; })); 私の勉強不足ですが、上記のようにしている意味は理解していません。
umyu

2017/11/28 04:26

まず、GUI(画面)はシングルスレッドモデルというのがあります。1つのスレッドからしかアクセスできません。コメント欄の記述は別のスレッドからGUIのスレッドにアクセスするための方法です。
umyu

2017/11/28 04:35

MaincodeのStart()メソッドはMainWindow のボタンクリックイベント(GUIスレッド)から呼び出されいると勝手に思っていたのですが、エラーメッセージを見る限りではそうでは無いように見受けられます。タイマー等で呼び出す形になってませんか?
nodact

2017/11/28 05:41 編集

起動ボタンがありまして、そちらが押された後起動モードに移行しております。 その後は、終了ボタンが押されるまで常にStart()とほかいくつかを MainWindowで順番に呼び出し続けていると思われます。
umyu

2017/11/28 06:12

var ans = string.Empty; this.window.textbox1.Dispatcher.Invoke(new Action(() => { ans =this.window.textbox1.Text; }));
umyu

2017/11/28 06:12

Startメソッドをこの形に変更するとどのようになりますか?
nodact

2017/11/28 06:29

できました! 本当にありがとうございました。 コードの意味も分からない部分もありますので、 ご回答いただいた内容を勉強させていただきます。
umyu

2017/11/28 06:35

場当たり的な解決なので、プログラムの動きを理解しないまま、これ以上ソースコードを変更するのは避けたほうがいいと思います。そのプログラム作成者に聞いてみるのが一番なのでは。。 1,MainWindowのStartメソッドの呼び出し側を調査。 2,「WPF Dispatcher 」でグーグル検索 3,あと質問文には制約条件等あれば、最初に記載したほうがいいと思いました。
umyu

2017/11/28 06:36

↑調査する内容とグーグル検索のキーワードです、ご参考まで。
guest

0

引数で渡せばいいのでは?

C#

1public void Start(string ans) 2{ 3 /* 省略 */ 4}

投稿2017/11/28 03:03

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

フツーならMainWindowに配置されたButtonにハンドラ: Button_Click() を定義して:

C#

1 public partial class MainWindow : Window 2 { 3 ... 4 5 private void Button_Click(object sender, RoutedEventArgs e) 6 { 7 textBox2.Text = textBox1.Text; 8 } 9 }

なんてなコードを MainWindow.xaml.cs に書くんだけど、
それを maincode.cs でやりたいってことですか?

そもそもなんでそんなことしたいんですか?

投稿2017/11/27 00:31

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nodact

2017/11/27 01:11

ご回答いただきましてありがとうございます。 説明にはかなり端折って記載させていただいておりますが、 既存のプログラム自体の全体量はかなりの量になります。 そのため作り直すと、このためにかなりの工数がかかってしまい却下となりました。 このソフト自体、更新はこれが最後になると思われるため応急処置です。 なぜ、このようなことになったかといいますと、 MainWindow.xamlでは基本的な処理は行っています。 maincode.csでは、基本的に通信の部分が書かれています。 ほしい理由としましては、MainWindow.xamlで演算されている値を 通信で送信したいため、maincode.csに渡さなければなくなりました。 そのため、こちらでその都度値を打ち込むことや、ボタンを押すなどができない状況です。 説明不足で申し訳ございませんでした。
episteme

2017/11/27 01:20

...わからんのだが、「MainWindows内に"maincodeを使ってXXXを送信する"を追加する」のがそんなに工数かかるんですか?
guest

0

xmalではなくxamlです
TextBoxの名前が合っているか確認してください

csharp

1var ans = textBox1.Text;

投稿2017/11/26 21:52

編集2017/11/26 21:55
momf

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nodact

2017/11/26 23:41

ご回答いただきましてありがとうございます。 xamlを修正させていただきました。 名前はあっています。 Window.xaml.csからは、上記で値を拾えるのですが maincode.csからはできません。 他になにか考えられますでしょうか? また、ほかに何か必要な情報はありますか? よろしくお願いします。
momf

2017/11/27 00:28 編集

maincodeのウィンドウを作る、 もしくはmaincode内でWindowの変数を作れば出来るかと思います。
nodact

2017/11/27 00:05

maincodeのウィンドウは分け合って作成できないので、 インスタンスの作成をしてみましたが、結果は変わりませんでした。
momf

2017/11/27 00:09

Windowsとmaincodeそれぞれコードを載せてください。
nodact

2017/11/27 00:21

簡単ですが、載せました。 必要なところがあれば追加します。
momf

2017/11/27 00:30

public MainWindow mw; mw.textbox1で出来ませんか? textbox2からになっていますが、textbox1は存在していますか?
nodact

2017/11/27 00:37

var ans = textbox1.Text;の箇所に public MainWindow mw; mw.textbox1 を記載しましたがエラーが大量にでました。 textbox1は存在しています。
momf

2017/11/27 01:17 編集

epistemeさんもコメントしている通り、 普通はMainWindow.xaml.csのような物に書くのです。 名前空間も違いますし、コードが全部載ってる訳でもないので、最初から一度作り直した方が早いかなと… それと、WPFにはMVVMという書き方のパターンがあり、1度そちらを調べて学ぶことをおすすめします。
nodact

2017/11/27 01:14

「MVVM」、ぜひ勉強させていただきます。 コードを全部載せれなくすいません。 のせれない部分が多く、意味合いを同じようにしながら記載させていただきました。 作り直しが難しく、応急処置程度で何とかなるかと思ったのですが、、難しいそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問