C#: comment avez-vous reportez-vous au contenu du Programme.cs dans un formulaire.cs?
Je suis en train de placer une valeur (d'un objet) dans une variable et de le placer dans une zone de texte dans un formulaire.
Voici le code du formulaire:
public Form1(Deck mainDeck)
{
InitializeComponent();
int Val = mainDeck.ReturnCard(10);
textBox1.Text = Val.ToString();
}
mainDeck est un objet dans mon Programme.cs fichier
Le problème est le suivant: int Val = mainDeck.ReturnCard(10);
Oups, erreur incorrect.
C'est le réel:
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
Voici mon Programme.cs fichier:
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));
}
}
}
Modifier: Ok, je suis de passage mainDeck pour la Forme, mais je suis maintenant une autre erreur:
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
Edit: Edit: Bien, j'ai maintenant ce travail, mais je suis tombé sur un problème connexe, donc je préfère le mettre ici que dans une nouvelle question.
Passant mainDeck à la Form1 fonctionne très bien, mais que si je veux avoir un clic sur un bouton d'appel d'une méthode de cet objet. J'ai essayé en passant mainDeck comme ceci:
private void button1_Click(object sender, Deck mainDeck, EventArgs e)
{
mainDeck.Shuffle();
}
J'obtiens cette erreur:
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
GRR!
int Val = mainDeck.ReturnCard(10)
Est pont principal défini quelque part dans votre projet
Oui, voir le post (Édité).
Juste pensé que je ferais remarquer que vous pourriez gérer la button1_Click question en gardant une poignée pour une variable membre privée appelée "_mainDeck" (par exemple) dans votre Form1.cs. Cependant, l'utilisation d'une variable statique de Programme.cs, comme l'a souligné par Le Roi, est aussi une approche adaptée.
OriginalL'auteur Biosci3c | 2010-03-10
Vous devez vous connecter pour publier un commentaire.
La ligne
Pont mainDeck = nouveau Deck();
crée une variable locale avec le nom mainDeck... Qui n'est accessible que dans la Méthode main ()...
Place de la Déclaration ci-dessus la méthode main de la classe... le programme de la classe public et le maindeck comme public static... comme ce
Ensuite, vous pouvez accéder à partir de votre Formulaire comme
Espère que cette aide.
Je n'obtiens pas vous... Ici le MainDeck ne dépend pas de la Forme... C'est statique et de la personne à charge sur le Programme de la Classe... même lorsque votre formulaire est fermé, vous pouvez toujours accéder à la MainDeck à partir de la Classe de programmes d'
J'ai enfin l'obtenir. J'ai été un malentendu ce que vous voulez dire par l'électricité statique. Je pensais que vous parliez de la définition d'une classe statique, mais tu veux dire qu'un objet statique. Ouf, fonctionne très bien maintenant.
OriginalL'auteur The King
La façon la plus simple serait de changer la forme du constructeur pour passer en mainDeck.
Si vous avez besoin de vous y référer dans d'autres parties de vos formulaires de code, vous pouvez garder une variable membre privée qui traînent ...
Et puis dans votre Programme.cs fichier ...
Edit: En réponse à votre nouvelle erreur impliquant l'accessibilité de la Pont classe, c'est parce que votre Deck de classe n'est pas public. Ajouter le public mot-clé de la déclaration de la classe, donc:
Note qu'il pourrait être plus propre pour garder votre Deck de classe dans une autre .cs fichier, telles que le Pont.cs.
OriginalL'auteur Pandincus
En supposant mainDeck est statique, et soit public ou interne, vous pouvez y accéder via
Oui, parce que vous n'avez pas créer une instance de la
Program
classe - laMain
méthode qui fonctionne est une méthode statique. Sinon (et correctement), comme Pandincus l'indique, vous devez juste passermaindeck
comme une référence àForm1
(par le biais de constructeur ou de propriété).OriginalL'auteur Judah Gabriel Himango
Le problème, c'est que vous essayez de consulter
mainDeck
comme une variable globale, qui n'est pas autorisé en C#.L'erreur que vous obtenez est parce que le compilateur suppose que
mainDeck
est un type que vous essayez de référence et n'a pas une définition pourmainDeck
.Évidemment, ce n'est pas ce que vous voulez. Pour résoudre le problème que vous aurez à faire de référence à la disposition
mainDeck
avec une variable statique de votre mainDeck de classe ou peut-être utiliser un pattern Singleton pour résoudre le problème.Edit:
Après que vous avez ajouté votre code, c'est peut être le plus simple pour passer le
mainDeck
référence à 'Form1`. Soit dans le cadre de Form1 constructeur ou une propriété qui peut être définie.OriginalL'auteur Philip Fourie