2010-12-07 2 views
1

これは前に尋ねられたことですが、私の状況は少し違っていると思います。私はこれをしっかりとやり遂げるのに約4時間を費やし、ついに実現しました、私は何をすべきか分かりません。C# "public"を除いた外部クラスのコントロールへのアクセス

私は2つのフォーム(Form1、Settings)と私がテーマと呼ばれるクラスを作成しました。

現在動作していますが、Form1内にあるすべてのプロパティを取得しています。私はForm1の外側とThemes.csにあるように、テーマ設定に関連する多くのコードを移動したいと思います。

テーマを変更する:テーマを変更するには、ユーザーが設定フォームを開き、ドロップダウンメニューからテーマを選択して[設定]ボタンを押します。これはすべて機能しますが、今は自分のテーマに移動しますクラスと私はコンパイルするコードを取得することはできません。

ここに移動前に動作するコードの例を示します。これは修正する2つの異なるコントロールですが、合計で約30個あります。私は、コードをabridgingています:

フォーム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; } 
    } 

セッティングフォーム:

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....] 
     } 

テーマクラスは現在空です。ここでも目的は、できるだけ多くのコードをテーマクラス(具体的にはget/setステートメント)に移動し、うまくいけば適切な休憩アイテムが選択されたら設定フォーム内でこれに似たメソッドを使用することです。SetTheme(Default);

誰かが助けてくれることを願っています。私は私の脳をぶち壊しており、私はこれをかなり早く完了させる必要があります!私は誰もが確信しているので、事前に多くの感謝。誰かが遠隔地に行きたいと思うなら、私はチームビューアーかログメインを持っています - それは簡単です。

必要に応じて私のプロジェクトをzip形式で送信することもできます。そんなに

おかげで、

クルト

レビューのため

修正コード:

をForm1フォーム:

public partial class Form1 : ThemeableForm 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

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; } 
    } 

セッティングは形成:

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; 
     } 

今私の取得/設定内のすべてのコントロール(上記の例のコードでLrssのは)does not exist in the current contextと一緒にエラー。また、私は警告を受ける:その中の クラスのいずれも設計しないことができるので、

警告1The設計者は、このファイルのため表示できませんでした。デザイナーはファイル内のクラスに続いて を検査しました:

Form1 ---基本クラス 'RSSReader_BKRF.ThemeableForm'を にロードできませんでした。アセンブリが参照され、すべてのプロジェクト が構築されていることを確認してください。色、フォントなど

設定テーマを選択し、デフォルトのテーマとしてそれを書き出す形成してみましょう:0

+0

Winforms、webforms、または何ですか? –

+1

コードスニペットのWinformsのようです。ウェブフォームはページから継承します。 –

+1

申し訳ありませんがこれまでにこれにも、それを参照してください - そのC#Windowsフォーム –

答えて

0

0はThemesクラスは、主にテーマが変更されたときに変化するデータで構成されてみましょう。これがWinFormsの場合は、[設定]フォームで選択したテーマを返すThemesクラスの静的CurrentThemeプロパティを持つことができます。

をForm1および任意の他の形態は、現在のテーマにそのプロパティの一部を委任してみましょう:あなたはその後、基本フォームクラスまでこれらの委任の性質をプッシュしたい場合があります

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

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

、複数のフォームで共有します。

+0

ちょっとジョン、あなたの迅速な応答もありがとう。私が提供したコードを使用して、あなたが示唆しているものの例を示すことができると思いますか?私はそれに従わず、コード例が好きです! –

+0

@Kurt:申し訳ありませんが、私はそれを行う時間がありません。 –

0

[OK]をクリックすると、設定フォームでいくつかの(多くの)他のフォームのプロパティの値を操作しようとしています。

1つの解決策は、同じ抽象クラスから継承する他のすべてのフォームをThemeableFormと呼ぶことです。これで、すべての共通プロパティを持つようにThemeableFormを定義できます。

短い例:

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; } 
    } 
} 

し、Form1宣言:

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

をあなたはTHemeableFormが継承されるか、誰を/制御する場合がありますので、私は "内部" として、それを宣言しました。しかし、あなたはそれを公開することもできます。設定は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....] 
    } 
} 

したがって、他のフォームタイプごとに設定コードをコピーする必要はありません。

+0

あなたは早いです!私はこれを試してあなたに戻って待つことができません。本当にありがとうJeff!私はそれを行くよ –

+0

オケイジェフ、私はあなたのコードをtryed、今私はすべてのコントロールのために '現在のコンテキストに存在しない'を取得します。私はそれらを公開することができますが、私はいつも公開することができ、それはスマートな練習ではないと聞きました。ここに私のコードを確認するためのサンプルがあります: –

+0

ジェフ、私のオリジナルの質問の下にあるコードを参照してください 'レビューのための変更されたコード' - これはあなたが言ったと信じて、 。本当にありがとう。 –

関連する問題