QA@IT

Datatableに関する質問です。どうか教えてください。

3201 PV

visual studio 2012のC# と Windows 8 proを利用しています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace DataTable_SD_sample
{
    public partial class DataTableSD : Form
    {
        public DataTableSD()
        {
            InitializeComponent();
        }

        private void loginBox_TextChanged(object sender, EventArgs e)
        {

        }

        private void DataTableSD_Load(object sender, EventArgs e)
        {

        }

        private void passwordBox_TextChanged(object sender, EventArgs e)
        {
            passwordBox.PasswordChar = '●';
        }

        private void connectbutton_Click(object sender, EventArgs e)
        {

            if (loginBox.TextLength == 0)
            {
                MessageBox.Show("ログイン名を記入してください!!");
                return;
            }

            if (passwordBox.TextLength == 0)
            {
                MessageBox.Show("パスワードを記入してください!!");
                return;
            }

            string[] result = new string[2];
            result[0] = loginBox.Text;
            result[1] = passwordBox.Text;

            DataSet ds = null;

            string sConnectionString;
            sConnectionString = @"Data Source='" + result[0] + "';Initial Catalog=SmartDietitian;User ID=sa;Password='" + result[1] + "';";
            SqlConnection objConn
                = new SqlConnection(sConnectionString);

            try
            {


                ds = new DataSet();

                SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Kondate", objConn);

                objConn.Open();

                adapter.Fill(ds);

                objConn.Close();

                MessageBox.Show("処理が終了しましたので、終了します!!");
            }
            catch (Exception ex)
            {

                MessageBox.Show("データベースに接続できませんでした!!");

            }
        }
    }
}

このフォームで取得したローカルDatatable dsの内容を別のフォームのdataGridView表示したいのですが、どのようにしたらよいのでしょうか。dsをローカル変数ではなく、グローバル変数のように利用したいのですが、よくわかりません。よろしくお願いします。

回答

そのDataTableの有効範囲をどの程度にするか、次のFormをどこで作るかによっても変わってきますが、

  • そのDataTableが必要なFormのコンストラクタで受け取る様にする その次のFormが動作するに必須の情報であればコンストラクタで受け取る様にする事で、指定を強制できます
  • 次のFormにDataTableを受け取るプロパティやメソッドを用意して、newした後に渡す ただし振る舞いが受動的になるので注意が必要です。
  • 次のFormのParentプロパティを通じて、開き元のFormから取得する。 開き元のFormに取り出す仕組みが必要。開き元が正しいか、まだ存在するか注意が必要です。
  • アプリケーション全体の情報を持つためのクラスを作りそこに保管する staticか singletonで実装する

などのやり方があると思います。

編集 履歴 (1)
  • 連絡が遅くなり、すいません。やってみます。
    -

パブリックプロパティを定義して、それを使って ds を渡すようにしてはいかがですか?

#質問とは関係ないことですが、SqlDataAdapter を使う場合は Open / Close は Fill の際に自動的にやってくれますので、前で Open したものと同じ接続が使いたいなどの理由がなければ不要です。

編集 履歴 (0)
  • ありがとうございます。やってみます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。