質問
ボタンを押すだけでデータをデータベースに保存しようとしていますが、変数は定義されている場所の性質上、プライベートなようです。定義されている場所に移動しようとしましたが、他のエラーが発生するようです。
修正があったのに、なぜそのように修正されたのですか?
コードは次のとおりです。
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.
}
}
}
解決
コンストラクタで dTable
および adapter
を宣言しているため、コンストラクタが完了するとすぐにスコープ外になります。
次のように、変数宣言をメインクラスに移動します。
public partial class Form1 : Form
{
private DataTable dTable;
private OleDbDataAdapter adapter;
Public Form1()
{
... your setup here ...
dTable = new DataTable();
... etc ...
}
}
他のヒント
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スコープを変更して、ボタンクリックメソッドイベントにアクセスできるようにする必要があります。それらをコンストラクターで宣言する場合、他のメソッドでは受け入れられないため、それらを「グローバル」なオブジェクトフィールドとして宣言する必要があります。オブジェクトインスタンスに。
各変数が必要なスコープを調べる必要があります。ローカルスコープを持つことができます。つまり、メソッドまたはクラススコープ内で宣言され、メソッド外で宣言されます。
アダプターは、クラス自体ではなく、Form1のコンストラクターにスコープされます。
アダプターとdtableをクラスのプライベートメンバーに移動します。
更新:[ため息] 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;
}
}
adapterおよびdTableは、コンストラクター内で宣言されます。クラス全体のスクープを取得するには、両方をコンストラクターから「移動」する必要があります。 Franciがアダプターで行ったように。
他のエラーが発生する可能性がありますが、コンパイラエラーを投稿していない場合は推測が困難です。
/ johan /