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

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

ただいまの
回答率

88.35%

WinFormで別フォームからDataをDataGridViewに表示できない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,783

FacePanel

score -4

Windows Formsで本体のFormとは別のFormにADO.NETのDataTableを渡して、そのFormから元のFormのDataGridViewにdetaGridView1.DataSource = table1と、データを表示させようとしても、元の本体のFormのDataGridViewに変化が起こりません。
一体どうしてなのでしょうか?
データのソースを示して質問したいのですが、コードが長すぎて出来ません。
なお、DataTableのtable1のデータはSQL Serverのものです。

よろしくお願い致します。

質問を編集させていただきます。

まず、前スレッドは削除依頼をしました。また、Visual Studio Community 2017 Version 15.8.4です。

NewForm form1 = new NewForm();
form1.Server = serverName;
form1.Authentic = authentic;
form1.LogName = loginName;
form1.LogPass = loginPass;

form1.Table = dataTable;
form1.Show();

なお、このserverName, authentic, loginName, loginPassは、SQL Serverのものです。

また、この現象を再現する最小限のものを提示したいのですが、まだ、再現できる状態でお見せできる状態にはなっていません。
ただ、怪しいのは、大元のFormをNewFormのなかで、MotoForm form = new MotoForm();というコードを入れたうえで、そのdataGridView1のDataSourceにDataTableを入れたことで、元々表示されていたMotoFormとは別のMotoFormのdataGridView1に
DataTableを表示させていたのかも知れません。再現できるコードの提示とは別に、ちょっと調べてみます。

あと、NewFormの呼び出しに当たっては、上記のloginNameなどとは別に、

            form1.NewForm = this;
コード


とし、NewFormのcs内では、

        public Form NewForm
        {
            get { return newForm; }
            set { newForm = value; }
        }


として、newformにMotoFormを渡しておりました。

このため、問題は、別フォームからDataGridViewに表示できないという問題ではなくて、別フォームから元のMotoFormに戻れないということのようです。

というのも、別フォームのボタンクリックイベントとして、

motoForm.SetDataOnGrid(server, authentic, logname, logpass, f, c, l, a, s);


というように、motoFormのメソッドにアクセスするためにMotoForm form = new MotoForm();というコードが必要だったからです。

MotoForm form = new MotoForm();というコードを利用しないで、MotoFormのdataGridView1にDataTableを表示させるにはどうしたらよいのか、という問題のようでした。

ここまでで、何を言いたいのかわかっていただけたでしょうか?


ややっこしいといけないので、あらためてのエッセンスだけにしたものを提示させていただきます。

// 親フォームは以下のコード
namespace FormsApp
{
    public partial class OyaForm : Form
    {
        public OyaForm()
        {
            InitializeComponent();
        }

        private void oyaButton_Click(object sender, EventArgs e)
        {
            KoForm koForm = new KoForm();
            koForm.Show();
        }
    }
}

// 子フォームには以下のコード
        private Form oyaForm = new Form();
        private string sKoText = "";

        public KoForm()
        {
            InitializeComponent();
        }

        public Form justOyaForm
        {
            get { return oyaForm; }
            set { oyaForm = value; }
        }


        private void koButton_Click(object sender, EventArgs e)
        {
            if (koBox.Text != "")
            {
                sKoText = koBox.Text;
                Form oya = new OyaForm();
                oya.oyaBox.Text = sKoText;  // ここがエラーとなって、コンパイルできません。
            }
        }

最小限というと、こんなところです。上記、エラー部分をどうしたらよいでしょうか?
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Zuishin

    2018/09/24 16:04

    コードはコードブロックに入れてください。最小限というのはコンパイルできて問題が再現する最小限という意味で、「あ」でも「う」でも書けばいいというわけではりません。

    キャンセル

  • Zuishin

    2018/09/24 16:05

    たとえば Ahthentic とか LogPass は問題の再現に必要ありませんし、form1 は元のフォームではなく新しいフォームですよね? それだと質問本文と食い違います。

    キャンセル

  • YAmaGNZ

    2018/09/24 20:18 編集

    NewFormのほうの実装はどうなっているのでしょうか?
    というか、DataGridViewが一切出てきませんが、どうなっているのでしょうか?

    キャンセル

回答 2

checkベストアンサー

0

NewFormのなかで、MotoForm form = new MotoForm();というコードを入れたうえで、そのdataGridView1のDataSourceにDataTableを入れたことで、元々表示されていたMotoFormとは別のMotoFormのdataGridView1に
DataTableを表示させていたのかも知れません。

これをしているならそれが原因です。

追記

次を試してください。
まず、oyaBox が private だと思うので、外からは oyaBox にアクセスできないはずです。
そこで public プロパティからテキストにアクセスできるようにしました。
次に、KoForm のインスタンスを作成した後に自身のインスタンスを渡すようにしました。
それから、oyaForm のインスタンスが無駄に複数作成されていたのを削除しました。
最後に、sKoText を oyaBox.Text ではなく先ほど作った oyaBoxText に代入するよう変更しました。

// 親フォームは以下のコード
namespace FormsApp
{
    public partial class OyaForm : Form
    {
        public OyaForm()
        {
            InitializeComponent();
        }

        public string oyaBoxText
        {
            get { return oyaBox.Text; }
            set { oyaBox.Text = value; }
        }

        private void oyaButton_Click(object sender, EventArgs e)
        {
            KoForm koForm = new KoForm();
            koForm.justOyaForm = this;
            koForm.Show();
        }
    }
}

// 子フォームには以下のコード
        private Form oyaForm;
        private string sKoText = "";

        public KoForm()
        {
            InitializeComponent();
        }

        public OyaForm justOyaForm
        {
            get { return oyaForm; }
            set { oyaForm = value; }
        }


        private void koButton_Click(object sender, EventArgs e)
        {
            if (koBox.Text != "")
            {
                sKoText = koBox.Text;
                justOyaForm.oyaBoxText = sKoText;  // ここがエラーとなって、コンパイルできません。
            }
        }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/26 09:05 編集

    そのエラーには日本語で「oyaBoxText がない」と書いてあります。
    ですから、Modifiers をいじるのではなく、私の回答のように oyaBoxText を作らなければなりません。
    Modifiers をいじってフィールドを外側に公開するのはあまりよくないので、このように必要なプロパティだけ公開してください。

    キャンセル

  • 2018/09/26 09:22

    justOyaFormがForm型となっているので、justOyaForm.oyaBoxTextの時にキャストするか、プロパティをOyaForm型にしないといけないのでは?

    キャンセル

  • 2018/09/26 09:25

    そうでした。そこも間違えていましたので修正しました。

    キャンセル

0

NewForm(form1)のnewFormにMotoFormをセットするのであれば
NewForm側でMotoFormを呼び出すのは

newForm.SetDataOnGrid(server, authentic, logname, logpass, f, c, l, a, s);


なのではないのですか?

クラス名やプロパティ名は変えた方がいいでしょう。
NewFormクラスのnewFormプロパティにMotoFormをセットする。
NewFormクラスから見たら、MotoFormがnewFormとなるので
説明するだけでこんがらがりますよね

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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