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

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

ただいまの
回答率

91.37%

  • C#

    4751questions

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

  • Visual Studio

    1202questions

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

  • XAML

    183questions

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

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

解決済

回答 4

投稿 2017/11/26 23:30 ・編集 2017/11/27 09:23

  • 評価
  • クリップ 1
  • VIEW 249

nodact

score 21

質問を見ていただいてありがとうございます。
当方、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の中身

namespace TEST
{

    public partial class MainWindow : Window
    {
        private readonly Maincode maincode = new Maincode();
        public MainWindow()
        {
            InitializeComponent();
            maincode .TextBoxAdd = text_add;

        }
        private void text_add(string text)
        {
            this.textbox2.Dispatcher.BeginInvoke(
                new Action(() => {
                    textbox2.Text = text;
                }));
        }
    }
}

maincode.csの中身

namespace Maincode
{
    class Maincode
    {
        public Action<string> TextBoxAdd;// ログ出力用

        public void Start()
        {
           ---色々処理省略---
           string text = System.Text.Encoding.UTF8.GetBytes("Date");
           TextBoxAdd(text);     

           var ans = textbox1.Text; ←これはエラー
        }
    }
}


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/11/27 11:16

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

    キャンセル

  • nodact

    2017/11/28 11:51

    >ozwk様 はい。MainWindowです。

    キャンセル

回答 4

checkベストアンサー

+1

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

Window.xaml.cs

private readonly Maincode maincode;
public MainWindow()
{
  InitializeComponent();
  // Maincode側にMainWindowの参照を保持
  maincode = new Maincode(this);
  maincode .TextBoxAdd = text_add;
}

Maincode.cs

    class Maincode
    {
        public Action<string> TextBoxAdd;// ログ出力用
     private readonly MainWindow window;
        //コンストラクタを定義
        public Maincode(MainWindow window)
        {
          this.window = window;
        }
        public void Start()
        {
           //省略
          var ans = this.window.textbox1.Text;
        }


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

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

投稿 2017/11/27 10:53

編集 2017/11/28 15:13

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/28 12:07

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

    補足もいただきましてありがとうございます。
    クラスの違いが原因だったのですね。勉強不足ですいません。

    キャンセル

  • 2017/11/28 12:26

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

    キャンセル

  • 2017/11/28 12:34

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

    キャンセル

  • 2017/11/28 12:36

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

    キャンセル

  • 2017/11/28 12:42

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

    キャンセル

  • 2017/11/28 12:46

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

    キャンセル

  • 2017/11/28 12:49

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

    キャンセル

  • 2017/11/28 12:55

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

    キャンセル

  • 2017/11/28 13:04 編集

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

    キャンセル

  • 2017/11/28 13:26

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

    キャンセル

  • 2017/11/28 13:35

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

    キャンセル

  • 2017/11/28 14:41 編集

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

    キャンセル

  • 2017/11/28 15:12

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

    キャンセル

  • 2017/11/28 15:12

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

    キャンセル

  • 2017/11/28 15:29

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

    キャンセル

  • 2017/11/28 15:35

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

    キャンセル

  • 2017/11/28 15:36

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

    キャンセル

+1

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

public void Start(string ans)
{
    /* 省略 */
}

投稿 2017/11/28 12:03

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

var ans = textBox1.Text;

投稿 2017/11/27 06:52

編集 2017/11/27 06:55

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/27 08:41

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

    キャンセル

  • 2017/11/27 09:28 編集

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

    キャンセル

  • 2017/11/27 09:05

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

    キャンセル

  • 2017/11/27 09:09

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

    キャンセル

  • 2017/11/27 09:21

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

    キャンセル

  • 2017/11/27 09:30

    public MainWindow mw;
    mw.textbox1で出来ませんか?

    textbox2からになっていますが、textbox1は存在していますか?

    キャンセル

  • 2017/11/27 09:37

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

    textbox1は存在しています。

    キャンセル

  • 2017/11/27 10:17 編集

    epistemeさんもコメントしている通り、
    普通はMainWindow.xaml.csのような物に書くのです。

    名前空間も違いますし、コードが全部載ってる訳でもないので、最初から一度作り直した方が早いかなと…

    それと、WPFにはMVVMという書き方のパターンがあり、1度そちらを調べて学ぶことをおすすめします。

    キャンセル

  • 2017/11/27 10:14

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

    キャンセル

0

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

    public partial class MainWindow : Window
    {
        ...

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            textBox2.Text = textBox1.Text;
        }
    }

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

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

投稿 2017/11/27 09:31

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/27 10:11

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

    キャンセル

  • 2017/11/27 10:20

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

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • C#

    4751questions

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

  • Visual Studio

    1202questions

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

  • XAML

    183questions

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