Помогите кому-то новичку в переменных C # - PullRequest
2 голосов
/ 30 сентября 2008

Я пытаюсь сохранить данные в базе данных нажатием кнопки, но переменные кажутся закрытыми по природе их определения. Я пытался переместиться туда, где они определены, но, похоже, это приводит к другим ошибкам.

Учитывая исправление, почему оно было исправлено таким образом?

Код следует.

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.
        }
    }
}

Ответы [ 5 ]

10 голосов
/ 30 сентября 2008

Вы объявляете dTable и adapter в конструкторе, поэтому он выходит из области видимости, как только конструктор завершается.

Вы хотите переместить объявления переменных в основной класс, например:

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

    Public Form1()
    {
         ... your setup here ...
         dTable = new DataTable();
         ... etc ...
    }
}
3 голосов
/ 30 сентября 2008
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, чтобы они были доступны для события метода нажатия кнопки. Если вы объявляете их в конструкторе, они не могут быть доступны для других методов, вам нужно объявить их как поля объекта, чтобы они были «глобальными» для вашего экземпляра объекта.

Вам необходимо выяснить, для какой области нужна каждая переменная, вы можете иметь локальную область, то есть объявленную внутри метода или области класса, объявленную вне метода.

1 голос
/ 30 сентября 2008
Адаптер

ограничен конструктором Form1, а не самим классом.

Переместите адаптер и dtable, чтобы они были частными членами класса.

0 голосов
/ 30 сентября 2008

адаптер и dTable объявлены в вашем конструкторе. Они оба должны быть «удалены» из конструктора, чтобы получить широкий класс. Так же, как Франци сделал с адаптером.

Могут быть и другие ошибки, но трудно догадаться, если вы не опубликовали ошибку своего компилятора.

/ Johan /

0 голосов
/ 30 сентября 2008

Обновление: [вздох] Я забыл переместить dTable в класс cope ...

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...