C #: как вы относитесь к содержанию в Program.cs в форме .cs? - PullRequest
4 голосов
/ 10 марта 2010

Я пытаюсь поместить значение (из объекта) в переменную и поместить его в текстовое поле в форме.

Вот код формы:

public Form1(Deck mainDeck)
    {
        InitializeComponent();
        int Val = mainDeck.ReturnCard(10);
        textBox1.Text = Val.ToString();
    }

mainDeck - это объект в моем файле Program.cs

Проблема в следующем: int Val = mainDeck.ReturnCard (10);

Упс, неправильная ошибка. Это настоящий:

Error 1 The name 'mainDeck' does not exist in the current context C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 17 23 Pcard

Вот мой файл Program.cs:

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

namespace Pcard
{
    class Deck
    {
        public Deck()
        {
            // Assign standard deck to new deck object
            //   int j;
            for (int i = 0; i != currentDeck.Length; i++)
            {
                currentDeck[i] = originalCards[i];
            }
            // Fisher-Yates Shuffling Algorithim    ---   Do initial shuffle
            Random rnd = new Random();

            for (int k = currentDeck.Length - 1; k >= 0; k--)
            {
                int r = rnd.Next(0, k + 1);

                int tmp = currentDeck[k];
                currentDeck[k] = currentDeck[r];
                currentDeck[r] = tmp;
            }
        }
        public void Shuffle()
        {
            Random rnd = new Random();

            for (int k = currentDeck.Length - 1; k >= 0; k--)
            {
                int r = rnd.Next(0, k + 1);

                int tmp = currentDeck[k];
                currentDeck[k] = currentDeck[r];
                currentDeck[r] = tmp;
            }
        }
        public int[] ReturnDeck()
        {
            return currentDeck;
        }
        public int ReturnCard(int num)
        {
            return currentDeck[num];
        }

        public int[] originalCards = new int[54]
        {
            0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,
            0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D,
            0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D,
            0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D,
            0x50, 0x51
        };
        private int[] currentDeck = new int[54];

    }
   public class Program
    {
        static void Main(string[] args)
        {
            // Create a Deck object
            Deck mainDeck = new Deck();
            Console.WriteLine("Here is the card array:");
            for (int index = 0; index != 54; index++)
            {
                string card = mainDeck.ReturnCard(index).ToString("x");
                Console.WriteLine("0x" + card);
            }
            //Return 10th Card
            int PickCard = mainDeck.ReturnCard(10);
            Console.WriteLine("Here is the 10th Card");
            Console.WriteLine("0x" + PickCard);
            //Shuffle
            mainDeck.Shuffle();
            Console.WriteLine("Shuffling..");
            PickCard = mainDeck.ReturnCard(10);
            Console.WriteLine("Here is the 10th card now: 0x" + PickCard);
            Application.Run(new Form1(maindeck));
        }
    }
}

Редактировать : Хорошо, я передаю mainDeck в форму, но теперь я получаю другую ошибку: Error 1 Inconsistent accessibility: parameter type 'Pcard.Deck' is less accessible than method 'Pcard.Form1.Form1(Pcard.Deck)' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.cs 14 16 Pcard

Редактировать: Редактировать: Хорошо, теперь у меня есть эта работа, но я столкнулся с связанной проблемой, поэтому я бы скорее поставил ее здесь, чем в новом вопросе.

Передача mainDeck в Form1 работает нормально, но что если я хочу, чтобы нажатие кнопки вызывало метод в этом объекте. Я попытался передать mainDeck так:

 private void button1_Click(object sender, Deck mainDeck, EventArgs e)
        {
            mainDeck.Shuffle();
        }

Я получаю эту ошибку:
Error 1 No overload for 'button1_Click' matches delegate 'System.EventHandler' C:\Users\Chris\Documents\Visual Studio 2008\Projects\Pcard\Pcard\Form1.Designer.cs 51 35 Pcard

ГРР!

Ответы [ 4 ]

7 голосов
/ 10 марта 2010

Самый простой способ - изменить конструктор формы, передав его в mainDeck.

public Form1(Deck mainDeck)
{
    InitializeComponent();
    int Val = mainDeck.ReturnCard(10);
    textBox1.Text = Val.ToString();
}

Если вам нужно сослаться на него в других частях кода форм, вы можете оставить личную переменную-член лежащей вокруг ...

private Deck _mainDeck;

public Form1(Deck mainDeck)
{
    InitializeComponent();
    _mainDeck = mainDeck;
    int Val = _mainDeck.ReturnCard(10);
    textBox1.Text = Val.ToString();
    }
}

private void SomeOtherMethod()
{
    int blah = _mainDeck.Blah();
}

А потом в вашем файле Program.cs ...

Application.Run(new Form1(mainDeck));

Редактировать: В ответ на вашу новую ошибку, связанную с доступностью класса Deck , ваш класс Deck не является общедоступным. Добавьте ключевое слово public в объявление класса, так:

namespace Pcard
{
    public class Deck
    {
        // and so on ... 

Обратите внимание, что было бы лучше хранить класс Deck в отдельном файле .cs, например, Deck.cs.

3 голосов
/ 10 марта 2010

Линия Deck mainDeck = new Deck (); просто создает локальную переменную с именем mainDeck ... которая доступна только в методе Main () ...

Поместите объявление над методом Main в классе ... Сделайте класс программы общедоступным, а основную палубу общедоступной статической ... как это

public class Program 
{ 
       // Create a Deck object 
   public static Deck mainDeck = new Deck(); 
    static void Main(string[] args) 
   { 
     .....

   }

Затем вы можете получить доступ из своей формы как

 int Val = Program.mainDeck.ReturnCard(10);

Надеюсь, это поможет.

1 голос
/ 10 марта 2010

Проблема в том, что вы пытаетесь сослаться на mainDeck как глобальную переменную, что не разрешено в C #.

Ошибка, которую вы получаете, заключается в том, что компилятор предполагает, что mainDeck является типом, на который вы пытаетесь сослаться, и не имеет определения для mainDeck.

Очевидно, это не то, что вы хотите. Чтобы решить проблему, вам нужно будет сделать ссылку доступной для mainDeck со статической переменной из класса вашего mainDeck или, возможно, использовать шаблон Singleton для решения проблемы.

Edit: После того, как вы добавили свой код, может быть проще всего передать ссылку mainDeck на «Form1». Либо как конструктор части Form1, либо как свойство, которое можно установить.

1 голос
/ 10 марта 2010

Предполагая, что mainDeck является статическим и общедоступным или внутренним, вы можете получить к нему доступ через

int val = Program.mainDeck.ReturnCard(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...