2

ボタンを押してデータベースにデータを保存しようとしていますが、変数が定義されている場所の性質上、変数は非公開のようです。それらが定義されている場所に移動しようとしましたが、これにより他のエラーが発生するようです。

修正が与えられた場合、なぜそのように修正されたのですか?

コードは次のとおりです。

namespace enable
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            OleDbDataAdapter adapter = new OleDbDataAdapter(strSQL, favouriteConnection);
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(adapter);
            DataTable dTable = new DataTable();
            adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            adapter.Update(dTable);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }
    }
}
4

5 に答える 5

10

コンストラクターで宣言しdTableadapterいるので、コンストラクターが完了するとすぐにスコープから外れます。

次のように、変数宣言をメインクラスに移動します。

public partial class Form1 : Form
{
    private DataTable dTable;
    private OleDbDataAdapter adapter;

    Public Form1()
    {
         ... your setup here ...
         dTable = new DataTable();
         ... etc ...
    }
}
于 2008-09-30T19:01:04.073 に答える
3
namespace enable
{    
    public partial class Form1 : Form
    {

    OleDbDataAdapter adapter;
    DataTable dTable = new DataTable();

        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            adapter = new OleDbDataAdapter(strSQL, favouriteConnection);
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(adapter);
            adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            adapter.Update(dTable);            
        }
        private void button1_Click(object sender, EventArgs e)
        {
            adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }
    }
}

ボタンクリックメソッドイベントにアクセスできるように、DataAdapterとdataTableスコープを変更する必要があります。コンストラクターでそれらを宣言する場合、他のメソッドではアクセスできない場合は、オブジェクトインスタンスに対して「グローバル」になるオブジェクトフィールドとして宣言する必要があります。

各変数が必要なスコープを見つける必要があります。ローカルスコープ、つまり、メソッド内で宣言されたスコープ、またはメソッド外で宣言されたクラススコープを持つことができます。

于 2008-09-30T19:01:15.880 に答える
1

アダプターのスコープは、クラス自体ではなく、Form1のコンストラクターです。

アダプタとdtableをクラスのプライベートメンバーに移動します。

于 2008-09-30T19:01:09.347 に答える
0

更新:[ため息]dTableをクラスコープに移動するのを忘れました...

namespace enable
{    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            OleDbConnection favouriteConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\\\192.168.123.5\\Share\\Matt\\BugTypes.mdb");
            string strSQL = "SELECT CategoryName, Show " + "FROM [Categories] WHERE Show = 'Yes' " + "ORDER BY CategoryName";
            m_Adapter = new OleDbDataAdapter(strSQL, favouriteConnection)l
            OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(m_Adapter);
            dTable = new DataTable();
            m_Adapter.Fill(dTable);
            BindingSource bSource = new BindingSource();
            bSource.DataSource = dTable;
            dataGridView1.DataSource = bSource;
            m_Adapter.Update(dTable);            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            m_Adapter.Update(dTable);//this is the button that needs to do the save, but can't see the variables.
        }

        OleDbDataAdapter m_Adapter;
        DataTable dTable;
    }
}
于 2008-09-30T19:00:13.670 に答える
-1

アダプターとdTableはコンストラクター内で宣言されます。クラス全体のスクープを取得するには、両方をコンストラクターから「移動」する必要があります。フランシがアダプターでしたように。

他のエラーがあるかもしれませんが、コンパイラエラーを投稿していないときは推測するのは難しいです。

/ johan /

于 2008-09-30T19:06:10.410 に答える