VS 2010Express, C#, Widnows Form App...

0

Witam,

Poszukuje podpowiedzi, gdzie leży przyczyna błędu kompilacji.

Posiadam plik "xxx.cs" gdzie mam definicje klas itd, "program.cs" gdzie wywoływane są obiekty. Jest oczywiście tez "Form1.cs".
Co pewien regularny czas wywołuje w "program.cs" pewne obiekty.

Problem: Klikając na przycisk (czyli dla pewnego button'a w "Form1.cs") w aplikacji chce wywołać metodę dla danego obiektu stworzonego w "program.cs".

"Error 1 The name '*****' does not exist in the current context ". //gdzie ***** to nazwa obiektu

Nie wiem gdzie leży problem. Wujek google mnie nie rozumie lub ja jego nie rozumiem.

0

Pokaż kod.

0

Form1.cs :

 
public void kupno_Click(object sender, EventArgs e)
        {
 
             int r = Convert.ToInt32(textBox1.Text);
             Uzytkownik1.Zakup(r, 3000.0);  // <-tutaj error mimo ze w Program.cs zostal stworzony Uztykownik1 prawidlowo
             MessageBox.Show("Kupiles " + r + " akcji o wartosci ");
                listBox1.Items.Add("Data zakupu: " + DateTime.Now + "UTC Twoja strefa");
                listBox1.Items.Add("Data zakupu: " + DateTime.UtcNow + "UTC 0");
                listBox1.Items.Add("Zakup: " + textBox1.Text + "akcji o wartosci: ");
                listBox1.Items.Add("\n");
           

        }
0

Z błędu wynika, że podana zmienna nie istnieje w twoim kontekście. W programowaniu zmienne mogą być globalne bądź lokalne (leżeć jedynie w danym kontekście), zmienna z pliku program.cs musi być lokalna i leżeć w obrębie wyłącznie klasy zawartej w tym pliku. Musisz przesłać obiekt Użytkownik1 do metody kupno_Click bądź do jej obiektu, aby była widoczna w programie.

Prosty przykład na czym polega błąd:

public class A{
public string zmienna2;

public void f(){
  int zmienna1;
  // tutaj jest zmienna1, bo znajduje się miedzy { } bądź w tej samej klasie jako pole
 // tutaj jest zmienna2, bo jest polem klasy 
  g(zmienna1);
}

public void e(){
// tutaj nie ma zmienna1, bo nie znajduje się w tej metodzie ani nie jest polem klasy
// tutaj jest zmienna2, bo jest polem klasy
}

public void g(int zmienna1){
// tutaj jest zmienna1, bo została przekazana jako parametr
// tutaj jest zmienna2, bo jest polem klasy 
}

}
 

Oczywiście to wszystko nie jest takie banalne, zmienna może być przekazywana przez referencje bądź wartość, jest też stos wywołań czy przesłanianie pól, lecz widać, że to prosty błąd, więc nie ma co tego komplikować.

0

@Saguaro
No właśnie hermetyzacji czy też zmiennych lokalnych jest mało i nawet nie dotyczą tego obiektu. Nawet gdy w "program.cs" chce przeslać coś np do listboxa (w Form1.cs) to nie widzi listboxa i jest kaszan. Głównie chodzi wywołanie metody Zakup dla Uzytkownika1 poprzez wciśnięcie przycisku, żadna filozofia a jednak hamuje człowieka.

0

Pokaż całą zawartość z Program.cs i formę.

0

@dam1an
"Form1.cs"

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;



namespace ThreadsTimer
{
    public partial class Form1 : Form 
    {
        
        public Form1()
        {
            InitializeComponent();

        }
       

        public void kupno_Click(object sender, EventArgs e)
        {
                
             int r = Convert.ToInt32(textBox1.Text);
             tablicaUzytkownikow[0].Zakup(r, 3000.0);
             MessageBox.Show("Kupiles " + r + " akcji o wartosci ");

                listBox1.Items.Add("Data zakupu: " + DateTime.Now + "UTC Twoja strefa");
                listBox1.Items.Add("Data zakupu: " + DateTime.UtcNow + "UTC 0");
                listBox1.Items.Add("Zakup: " + textBox1.Text + "akcji o wartosci: ");
                listBox1.Items.Add("\n");
           
        }

        private void sprzedaz_Click(object sender, EventArgs e)
        {
            int g = Int32.Parse(textBox1.Text);
            //tablicaUzytkownikow[0].Sprzedaz(g, 3000.0);
            listBox1.Items.Add(textBox1.Text);
            
          
        }

        public void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}

 

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

//wersja jaskiniowa po przeniesieniu z konsoli
namespace ThreadsTimer
{
    public static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            int i = 10, j = 4, m = 1; // 
            Transakcje[] tablicaUzytkownikow = new Transakcje[m];
            tablicaUzytkownikow[0] = new Transakcje(1000.0);
            Oprocentowanie[,] tablica2d = new Oprocentowanie[i, j];
            //ListBox1.Items.Add("notowanie nr {0,10} \n", x);
            tablica2d[0, 0] = new Oprocentowanie(-90, 120, "akcje", 300.0); // uruchomienie programu, wartosc poczatkowa 300
            tablica2d[0, 1] = new Oprocentowanie(-5, 20, "rynek pieniezny", 300.0);
            tablica2d[0, 2] = new Oprocentowanie(-10, 40, "obligacje", 300.0);
            tablica2d[0, 3] = new Oprocentowanie(-3, 70, "rynek zrownowazony", 300.0);

            tablica2d[0, 0].PokazO();
            tablica2d[0, 1].PokazO();
            tablica2d[0, 2].PokazO();
            tablica2d[0, 3].PokazO();
            // dalsza czesc programu, pobieranie wartosci zaktualizowanej, aktualizacja nastepuje zaraz po wylosowaniu oprocentowania
            for ( int x = 1; x < 3; x++) // test dla x <3
            {
                //ListBox1.Items.Add("notowanie nr {0,10} \n", x);
                tablica2d[x, 0] = new Oprocentowanie(-90, 120, "akcje", tablica2d[x - 1, 0].WA);
                tablica2d[x, 0].PokazO();
                tablica2d[x, 1] = new Oprocentowanie(-5, 20, "rynek pieniezny", tablica2d[x - 1, 1].WA);
                tablica2d[x, 1].PokazO();
                tablica2d[x, 2] = new Oprocentowanie(-10, 40, "obligacje", tablica2d[x - 1, 2].WA);
                tablica2d[x, 2].PokazO();
                tablica2d[x, 3] = new Oprocentowanie(-3, 70, "rynek zrownowazony", tablica2d[x - 1, 3].WA);
                tablica2d[x, 3].PokazO();
                
            }

        }
    }
}
 

"yyy.cs" // definicje klas

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ThreadsTimer
{
    class Transakcje
    {

        public int ilosc, xx;
        public double wartosc;
        public double WielkoscTransakcji;
        public double saldo;

        public Transakcje(double xxx)
        {
            saldo = xxx;
        }
        public void Zakup(int iloscie, double wartoscie)
        {
            ilosc = iloscie; wartosc = wartoscie;

            if ((double)ilosc * wartosc > saldo)// sprawdzanie czy mamy dostepne srodki na transakcje
            {
                //MessageBox.Show("brak srodków na tę transakcje");
                ilosc = 0;
            }
            else if ((double)ilosc * wartosc <= saldo)
            {
                WielkoscTransakcji = (double)ilosc * wartosc;
                saldo -= WielkoscTransakcji; 
                //listBox1.Items.Add("kuponoo  wartosc: {0,10:C} saldo : {1,10:C}", WielkoscTransakcji, saldo);
            }
            
        }
        public void Sprzedaz(int il, double wartoscie)
        {
            xx = il; wartosc = wartoscie;
            //if (ilosc < xx)
            //{
            //   MessageBox.Show("nie posiadasz tyle akcji");
            //}
            //else
            //{

            WielkoscTransakcji = (double)xx * wartosc;
            WielkoscTransakcji -= WielkoscTransakcji * 0.02;
            saldo += WielkoscTransakcji; //dodanie a pozniej przypisanie
            

            //}

        }

    }// koniec klasy Transakcje

    class Oprocentowanie
    {
        private int c; // wylosowana wartosc oprocentowania z przedzialu <a,b>
        public double o;  // o - oprocentowanie , d= 1000, ptrzebna do ulamka dziesietnego
        private double d = 1000d; // "przesuniecie" przecinka
        public string nazwy; // nazwa funduszu
        public double WA; // wartosc akcji

        public Oprocentowanie(int a, int b, string nazwa, double WP) // konstruktor
        {
        xxx:
            Random rnd = new Random();
            c = rnd.Next(a, b);
            o = (double)c / d;
            nazwy = nazwa;
            if (((WP * o) + WP) < 0) // zabezpieczenie aby wartosci nie spadly poniezej zera
            {
                goto xxx;
            }
            else
            {
                WA = (WP * o) + WP;
            }

            WP = WA; //przypisanie, aktualizacja
        }
        public void Clean()
        {
            //listBox1.Items.Add("przerwa w notowaniu 10s");
            Thread.Sleep(10000);
            //listBox1.Items.Add(DateTime.Now);
           
        }
        public void PokazO() //wyswietlanie   
        {
            //listBox1.Items.Add("zmiana wartosci o {0,-15:P} wartosc {1,-20:C} : {2,10:C}\n", o, nazwy, WA);
           
        }
    }//koniec klasy Oprocentowanie

   
}

 
2

Nie wiem nawet jak Ci to wyjaśnić, to są podstawy. Nie utworzyłeś nigdzie listy użytkowników w formie to jej tam nie będzie, musisz przekazać tą listę do formy.
Ogarnij jakiś tutorial.

To tak jak byś chciał zrobić:

void Metoda1()
{
    int a = 5;
    Console.WriteLine(a);
}

void Metoda2()
{
    Console.WriteLine(a);
}

Wykonując najpierw Metoda1, następnie Metoda2, nie spowoduje że a magicznie pojawi Ci się w drugiej metodzie.

Nie powinieneś nic robić w Main, przenieś to do formy lub do innej klasy.
Zamiast }//koniec klasy stosuj jeden plik cs na klasę, nie będziesz miał problemu ze znalezieniem jej końca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1