Question

J'essaie de sauvegarder des données dans une base de données en appuyant sur un bouton, mais les variables semblent être privées en raison de la nature de l'endroit où elles sont définies. J'ai essayé de me déplacer là où ils sont définis, mais cela semble produire d'autres erreurs.

Étant donné un correctif, pourquoi a-t-il été corrigé de cette façon?

Le code suit.

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.
        }
    }
}
Était-ce utile?

La solution

Vous déclarez dTable et adapter dans le constructeur, de sorte qu'il sort de la portée dès que le constructeur est terminé.

Vous souhaitez déplacer les déclarations de variable vers la classe principale, comme suit:

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

    Public Form1()
    {
         ... your setup here ...
         dTable = new DataTable();
         ... etc ...
    }
}

Autres conseils

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

Vous devez modifier DataAdapter et la portée de dataTable pour pouvoir accéder à l'événement de méthode de clic sur le bouton. Si vous les déclarez dans le constructeur, ils ne peuvent pas être utilisés avec d'autres méthodes, vous devez les déclarer comme champs d'objet pour qu'ils soient "globaux". à votre instance d'objet.

Vous devez savoir quelle portée a besoin de chaque variable. Vous pouvez avoir une portée locale, c'est-à-dire déclarée dans une méthode ou une étendue de classe, déclarée en dehors d'une méthode.

l'adaptateur est limité au constructeur de Form1, pas à la classe elle-même.

Déplacez l'adaptateur et la table de contrôle pour qu'ils soient des membres privés de la classe.

Mise à jour: [soupir] J'ai oublié de passer dTable à la classe pour faire face aussi ...

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

adaptateur et dTable sont déclarés dans votre constructeur. Ils doivent tous deux être «sortis» du constructeur pour obtenir un scoop large de la classe. Comme Franci l’a fait avec l’adaptateur.

Il peut y avoir d'autres erreurs, mais il est difficile de deviner si vous n'avez pas posté votre erreur de compilation.

/ johan /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top