Помогите новичку в переменных C#.
Вопрос
Я пытаюсь сохранить данные в базе данных одним нажатием кнопки, но переменные кажутся частными по природе того, где они определены.Я пытался переместить туда, где они определены, но, похоже, это приводит к другим ошибкам.
Учитывая исправление, почему оно было исправлено именно так?
Ниже приведен код.
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;
}
}
адаптер и dTable объявлены в вашем конструкторе.Их обоих следует «вынести» из конструктора, чтобы получить информацию для всего класса.Точно так же, как Франси сделал с адаптером.
Могут быть и другие ошибки, но их трудно догадаться, если вы не опубликовали информацию об ошибке компилятора.
/Йохан/