2010-12-07 2 views
1

Je sais que cela a déjà été demandé mais je crois que ma situation est un peu différente - ou je ne comprends pas les réponses données. J'ai passé environ 4 heures à travailler sur ce solide et finalement réalisé, je ne sais pas quoi faire.C# Accéder aux contrôles d'une classe externe sans "public"

J'ai deux formulaires (Form1, Settings) et une classe I créée appelée Themes.

J'ai les propriétés get/set qui fonctionnent actuellement mais qui sont toutes dans Form1 et je voudrais déplacer autant de code lié au thème que je peux en dehors de Form1 et en Themes.cs. Changement de thème: Pour modifier le thème, l'utilisateur ouvre le formulaire Paramètres et sélectionne un thème dans le menu déroulant et appuie sur le bouton «Set» - tout cela fonctionne, mais maintenant je veux le déplacer dans mon propre classe et je ne peux pas obtenir le code pour compiler.

Voici un exemple de code qui fonctionne avant de se déplacer - notez qu'il ne s'agit que de 2 contrôles différents que je veux modifier mais il y en a environ 30 au total. J'abrègent le code:

Formule 1:

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

    private void btnSettings_Click(object sender, EventArgs e) 
    { 
     Settings frm = new Settings(this); 
     frm.Show(); 
    } 

    private Color txtRSSURLBGProperty; 
    private Color txtRSSURLFGProperty; 

    public Color TxtRSSURLBGProperty 
    { 
     get { return txtRSSURLBGProperty; } 
     set { txtRSSURL.BackColor = value; } 
    } 

    public Color TxtRSSURLFGProperty 
    { 
     get { return txtRSSURLFGProperty; } 
     set { txtRSSURL.ForeColor = value; } 
    } 

Paramètres Forme:

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

    private Form1 rssReaderMain = null; 

    public Settings(Form requestingForm) 
    { 
     rssReaderMain = requestingForm as Form1; 
     InitializeComponent(); 
    } 

    private void button2_Click(object sender, EventArgs args) 
    { 
     // Appearence settings for DEFAULT THEME 

     if (cbThemeSelect.SelectedIndex == 1) 
     { 
      this.rssReaderMain.TxtRSSURLBGProperty = Color.DarkSeaGreen; 
      this.rssReaderMain.TxtRSSURLFGProperty = Color.White; 
      [......about 25 more of these....] 
     } 

La classe thème est actuellement vide. Encore une fois, le but est de déplacer autant de code dans la classe thèmes (en particulier les instructions get/set si possible!) Et j'espère juste utiliser une méthode similaire dans le formulaire Paramètres une fois l'objet drowndown sélectionné: SetTheme(Default);

J'espère que quelqu'un peut aider, et j'espère que je l'ai bien expliqué! Je me suis creusé la tête et j'ai besoin de faire ça assez vite! Merci beaucoup d'avance car je suis sûr que tout le monde dit. J'ai teamviewer ou logmein si quelqu'un veut se connecter à distance - c'est aussi facile.

Je peux aussi envoyer mon projet en zip si nécessaire.

Merci beaucoup,

Kurt

Code modifié pour examen:

forme Form1:

public partial class Form1 : ThemeableForm 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

forme ThemeableForm:

internal abstract class ThemeableForm : Form 
{ 
    private Color rssLabelBGProperty; 
    private Color rssLabelFGProperty; 

    public Color RssLabelBGProperty 
    { 
     get { return rssLabelBGProperty; } 
     set { lRSS.BackColor = value; } 
    } 

    public Color RssLabelFGProperty 
    { 
     get { return rssLabelFGProperty; } 
     set { lRSS.ForeColor = value; } 
    } 

formulaire Paramètres:

public Settings(ThemeableForm requestingForm) 
    { 
     rssReaderMain = requestingForm as ThemeableForm; 
     InitializeComponent(); 
    } 

    private ThemeableForm rssReaderMain = null; 

    private void button2_Click(object sender, EventArgs args) 
    { 

     // Appearence settings for DEFAULT THEME 

     if (cbThemeSelect.SelectedIndex == 1) 
     { 
      this.rssReaderMain.LRSSBGProperty = Color.DarkSeaGreen; 
      this.rssReaderMain.LRSSFGProperty = Color.White; 
     } 

Maintenant, les tous les contrôles dans mon get/set (LRSS dans le code exemple ci-dessus) erreur avec does not exist in the current context. Je reçois aussi l'avertissement:

Attention designer 1Le n'a pas pu être démontré pour ce fichier, car aucun des les classes à l'intérieur peut être conçu. Le designer a examiné les classes suivantes dans le fichier:

Form1 --- La classe de base 'RSSReader_BKRF.ThemeableForm' n'a pas pu être chargée.Assurez-vous que l'assembly a été référencé et que tous les projets ont été créés. 0 0

+0

Winforms, webforms, ou quoi? –

+1

On dirait que Winforms, à partir de ses extraits de code. Les formulaires Web héritent de la page. –

+1

Désolé n'a jamais répondu à cette question ni le voir - son C# Windows Forms –

Répondre

0

Que le composé classe Themes en grande partie des données qui changent lors d'un changement de thème: couleur, polices de caractères, etc.

Laissez les paramètres forment choisir un thème et l'écrire comme thème par défaut. Si c'est WinForms, alors vous pouvez juste avoir une propriété CurrentTheme statique de la classe Thèmes qui retourne le thème choisi dans le formulaire Paramètres.

Laissez Form1 et toute autre forme déléguer certaines de leurs propriétés au thème actuel:

private Color BackgroundColor 
{ 
    get {return Themes.CurrentTheme.BackgroundColor;} 
} 

private Color TextColor 
{ 
    get {return Themes.CurrentTheme.TextColor;} 
} 

Vous pouvez ensuite pousser ces propriétés déléguées à une classe de forme de base, à partager par de multiples formes .

+0

Hey John, Merci pour votre réponse rapide ainsi. Pensez-vous que vous pourriez utiliser le code que j'ai fourni pour me montrer un exemple de ce que vous suggérez. Je n'ai pas suivi une partie de cela et aimerais un exemple de code! –

+0

@Kurt: désolé, je n'aurai pas le temps de le faire. –

0

Ok, je vois que vous essayez de faire en sorte que le formulaire Paramètres manipule les valeurs des propriétés sur plusieurs (plusieurs?) Autres formes.

Une solution consiste à faire en sorte que tous les autres formulaires héritent de la même classe abstraite, appelons-la ThemeableForm. Vous pouvez maintenant définir ThemeableForm pour avoir toutes les propriétés communes.

Un court exemple:

internal abstract class ThemeableForm : Form { 
    private Color txtRSSURLBGProperty; 
    private Color txtRSSURLFGProperty; 

    public Color TxtRSSURLBGProperty 
    { 
     get { return txtRSSURLBGProperty; } 
     set { txtRSSURL.BackColor = value; } 
    } 

    public Color TxtRSSURLFGProperty 
    { 
     get { return txtRSSURLFGProperty; } 
     set { txtRSSURL.ForeColor = value; } 
    } 
} 

Et déclarer Form1:

public class Form1 : ThemeableForm { 
    // custom stuff for Form1, no need to write the common properties 
} 

Je déclare comme "interne" parce que vous pouvez contrôler qui/comment THemeableForm est héritée. Mais, vous pourriez le rendre public aussi. Et Les paramètres peuvent travailler avec un ThemeableForm:

public Settings(ThemeableForm requestingForm) 
{ 
    rssReaderMain = requestingForm as ThemeableForm; 
    InitializeComponent(); 
} 

private ThemeableForm rssReaderMain = null; 

private void button2_Click(object sender, EventArgs args) { 

    // Appearence settings for DEFAULT THEME 

    if (cbThemeSelect.SelectedIndex == 1) 
    { 
     this.rssReaderMain.TxtRSSURLBGProperty = Color.DarkSeaGreen; 
     this.rssReaderMain.TxtRSSURLFGProperty = Color.White;    
     [......about 25 more of these....] 
    } 
} 

Vous n'avez pas besoin de copier tout le code des paramètres pour chaque autre type de formulaire.

+0

wow vous êtes rapide! Je ne peux pas attendre pour essayer cela et revenir à vous. merci beaucoup Jeff! Je vais tenter le coup –

+0

Ok, Jeff, j'ai essayé votre code et maintenant je n'ai plus de «n'existe pas dans le contexte actuel» pour tous mes contrôles. Je peux les rendre publics, mais je pourrais toujours les rendre publics et j'ai entendu dire que ce n'est pas une pratique intelligente. Voici un échantillon de mon code pour vous confirmer: –

+0

Jeff, s'il vous plaît voir le code au bas de ma question initiale qui dit «Code modifié pour examen» - c'est ce que je crois que vous avez dit, et montre l'erreur im get . Merci beaucoup. –

Questions connexes