2010-12-07 3 views
1

이전에 물어 보았지만 상황이 약간 다르다고 생각합니다. 나는 단호하게 일하는 데 약 4 시간을 보냈다. 마침내 깨달았다. 나는 무엇을해야할지 모른다.C# "public"을 사용하지 않고 외부 클래스의 컨트롤에 액세스하기

2 개의 양식 (Form1, Settings)과 내가 만든 클래스를 테마라고합니다.

현재 작동하지만 Form1 내에있는 모든 속성을 가져 왔으며 Form1의 외부에서 Themes.cs으로 변경할 수있는 테마 지정과 관련된 많은 코드로 이동하고 싶습니다.

테마 변경 : 테마를 변경하려면 사용자가 설정 양식을 열고 드롭 다운 메뉴에서 테마를 선택하고 '설정'버튼을 누릅니다.이 모든 기능이 작동하지만 이제는 내 자신의 것으로 이동하려고합니다. 클래스 및 컴파일 할 코드를 가져올 수 없습니다.

다음은 이동하기 전에 작동하는 예제 코드입니다.이 코드는 수정하려는 두 가지 컨트롤이지만 약 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);

누군가가 도울 수 있기를 바란다. 나는 그것을 올바르게 설명하기를 희망한다! 나는 두뇌를 해치 웠고 나는 이것을 빨리해야 할 필요가있다! 모든 사람들이 확신 하듯이 미리 감사드립니다. 누군가가 원할 경우 teamviewer 또는 logmein이 있습니다.

필요한 경우 내 프로젝트를 우편 번호로 보낼 수도 있습니다. 너무 많은

감사합니다,

커트

검토

수정 된 코드 :

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

지금 내 GET/SET (위의 예제 코드에서 lRSS)의 모든 컨트롤이 does not exist in the current context 함께 오류가 발생했습니다. 또한 경고 메시지가 표시됩니다.

경고 1 중 하나도 설계 할 수 없기 때문에이 파일을 표시 할 수 없습니다. 디자이너가 파일의 클래스 다음에 을 검사했습니다.

Form1 --- 기본 클래스 'RSSReader_BKRF.ThemeableForm'을 로드 할 수 없습니다.어셈블리가 참조되었고 모든 프로젝트 이 빌드되었는지 확인하십시오. 색상, 글꼴 등

설정 테마를 선택하고 기본 테마로 쓰는 형성 보자 : 0

+0

Winforms, webforms 또는 무엇? –

+1

그의 코드 스 니펫에서 Winforms처럼 보입니다. 웹 폼은 페이지에서 상속됩니다. –

+1

죄송합니다.이 질문에 대답하거나 본 적이 없습니다. C# Windows Forms –

답변

0

0은 Themes 클래스가 크게 테마 변경하는 경우 변경 데이터로 구성합시다. 이것이 WinForms 인 경우 설정 양식에서 선택한 테마를 반환하는 Themes 클래스의 정적 인 CurrentTheme 속성 만있을 수 있습니다.

Form1에 어떤 다른 형태의 현재 테마에 해당 속성의 일부를 위임 할 수 : 그런 다음 기본 폼 클래스까지 이러한 위임 속성을 밀어 할 수 있습니다

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

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

, 다양한 형태로 공유 할 수 .

+0

안녕하세요, John, 빠른 답장을 보내 주셔서 감사합니다. 내가 제안한 코드를 사용하여 자신이 제안한 것을 보여줄 수 있다고 생각하십니까? 나는 그 중 일부를 따르지 않았고 코드 예제를 좋아할 것입니다! –

+0

@Kurt : 죄송합니다. 그렇게 할 시간이 없습니다. –

0

좋아, 당신이 설정 양식을 여러 가지 (많은?) 다른 양식의 속성 값을 조작하려고하는 것을 참조하십시오.

한 가지 해결책은 동일한 추상 클래스에서 다른 모든 폼을 상속하는 것입니다. 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

와우 당신은 빠릅니다! 나는 이것을 시험해보고, 당신에게 돌아 오기를 기다리지 않는다. 고마워, 제프! 나는 그것을 줄 것이다 –

+0

오케이 제프, 나는 당신의 코드를 시험해 보았고, 이제는 모든 컨트롤에 대해 '현재 컨텍스트에 존재하지 않는다'는 것을 알게되었다. 공개 할 수는 있지만 항상 공개 할 수는 있지만 현명한 방법이 아니라고 들었습니다. 다음은 확인할 수있는 코드 샘플입니다. –

+0

제프, '수정 된 코드 검토'라는 원래 질문 하단에있는 코드를 참조하십시오. 이는 내가 말한 것으로 생각하며 오류가 표시됩니다. . 정말 고마워. –

관련 문제