2010-08-09 3 views
1

Je commencerai par ceci: je ne suis pas bon en C#. Je ne sais pas pour la plupart ce que je fais. Maintenant que la clause de non-responsabilité est en route, j'essaie d'accéder à un TabControl dans mon interface (fait en utilisant VS2008, donc les parties sont dans Interface.Designer) d'une autre classe - sauf que l'utilisation de Interface.tabControl1 me dit que j'ai besoin d'une référence d'objet , et si je tape . après Interface je viens d'obtenir une liste de choses, pas un des objets dans l'interface. L'utilisation de Interface.ControlCollection n'aide pas non plus.Composants de référence C# dans la classe d'interface

L'aide est appréciée, et je suis sûr que c'est vraiment basique et je suis juste une clé, mais bon.

EDIT: en Program.cs (que je suppose été créée automatiquement quand je commencé à construire l'application), l'interface est créée sans nom:

static void Main() 
    { 
     Application.Run(new Interface()); 
    } 

Interface() est appelé à partir Interface.cs:

public partial class Interface : Form 
{ 
    public Interface() 
    { 
     InitializeComponent(); 
    } 
} 

Le le reste de la classe partielle est créé en Interface.Designer.cs - qui a été générée automatiquement lors de la construction de l'interface dans le concepteur VS2008.

Je ne suis pas sûr si cela aide, ou ne sert à rien. Mais il est de toute façon. =)

EDIT # 2:

Je pense que je devrais expliquer ce que je fais, peut-être alors les gens vont comprendre ce que je besoin de ceci:

j'avais une interface, avec un tabcontrol, et les onglets générés à la volée en fonction de ce que l'utilisateur faisait. Cela causait des problèmes parce que je ne faisais pas de chaque onglet son propre objet, donc quand il s'agissait d'accéder à des choses dans les pages sans affecter les autres onglets, ça ne marchait pas. En tant que tel, j'ai enlevé tout le code d'une méthode dans Interface.cs qui a été utilisé pour construire un onglet, et a fait une nouvelle classe appelée Tab.cs - C'est là que le problème des références brisées est apparu. Code pertinent, déplacé de l'interface dans l'onglet:

public Tab(string inputstring) 
{ 
    ..... 
    //call this method if button is clicked 
    cancel.Click += new System.EventHandler(this.close_Click); 
    //ridiculous calculations to get the buttons in the right place 
    int leftside = ((tabControl1.Width/100) * 96); 
    int bottomside = ((tabControl1.Height/100) * 93); 
    int bottomside2 = ((tabControl1.Height/100) * 99); 
    ..... 
    //call this method if button is clicked 
    save.Click += new System.EventHandler(this.save_Click); 
    ..... 
    //call this method when tab is entered 
    newtab.Enter += new System.EventHandler(this.tabSelect); 
} 

Le code avec tabControl1.Width est particulièrement pertinent. Cela ramène alors à ce que j'ai commencé à essayer de poser avant. J'espère que cela rendra peut-être les choses plus claires.

EDIT3: (pour Henk Holterman) J'ai renommé Interface en MainForm. VS2008 a décidé qu'il devrait s'appeler interface, je n'ai simplement pas changé cela. Mais je vois pourquoi le changement est bon, merci = P

+0

Vous pouvez améliorer cela en affichant des morceaux de code légèrement plus gros. Et essayez d'indiquer ce que l'interface est réellement (un formulaire?) –

+0

Nous sommes presque là, s'il vous plaît montrer _where_ que vous voulez accéder aux TabPages. –

+1

Et: 'Interface' est un très mauvais nom pour une classe Form. Que diriez-vous de le refactoriser à 'MainForm'? Utilisez l'Explorateur de solutions. –

Répondre

0

TabControl1 est un contrôle créé dans le Concepteur-partie de votre formulaire principal (en Interface.designer.cs). Donc tabControl1 fait référence à un champ d'instance. Vous devrez donner votre classe Tab dans Tab.cs votre instance du formulaire principal (comme dans le constructeur) afin que vous puissiez faire référence à cela. Aussi, vous devez vérifier que ces champs sont publics/internes afin que vous puissiez y accéder.

+0

Maintenant, mon cerveau fonctionne et je comprends ce que vous avez écrit, c'est exactement ce dont j'avais besoin pour faire fonctionner les choses! Je vous remercie. – omicronlyrae

2

Il me semble que Interface est le nom de la classe, et vous avez une instance de cette classe. Vous devez savoir quelle est l'instance appelée (disons myInstance), alors vous devriez pouvoir appeler myInstance.tabControl1.

Espérons que cela aide, et merci pour une utilisation rare du mot «clé» sur ce site.

David

+0

On dirait une bonne estimation. –

0

Si vous créez code dans le fichier Interface.cs, puis au lieu de taper Interface, tapez this faire référence à l'objet réel que vous utilisez.

Sinon, lorsque vous appelez l'autre classe de Interface, transmettez-lui un type d'objet Form, la référence réelle étant this.

Pour le faire fonctionner, changer votre méthode pour être:

public Tab(string inputstring, MainForm formInstance) 
{ 
    ..... 
    //call this method if button is clicked 
    formInstance.cancel.Click += new System.EventHandler(formInstance.close_Click); 
    //ridiculous calculations to get the buttons in the right place 
    int leftside = ((formInstance.tabControl1.Width/100) * 96); 
    int bottomside = ((formInstance.tabControl1.Height/100) * 93); 
    int bottomside2 = ((formInstance.tabControl1.Height/100) * 99); 
    ..... 
    //call this method if button is clicked 
    formInstance.save.Click += new System.EventHandler(formInstance.save_Click); 
    ..... 
    //call this method when tab is entered 
    formInstance.newtab.Enter += new System.EventHandler(formInstance.tabSelect); 
} 

ensuite appeler ceci:

// (somewhere in MainForm.cs) 
Tab("MyString", this); 
Questions connexes