2016-03-08 29 views
0

對於C#我很新,我只是想學習基礎知識。我正在創建的是一個爲我玩的2個遊戲讀取.txt文件(日誌文件)的程序。無盡的任務和MUD。我想要做的是當我加載.txt文件時,它會檢測它的EQ日誌或MUD日誌,然後顯示它將開始填充的正確數據字段(文本框等)向UserControls發送數據的表格

At首先,我打算使用一個groupBox,根據哪個日誌被加載,隱藏/顯示正確的groupbox。然而在我的研究中,我瞭解了UserControls。

我喜歡加載用戶控件到面板的想法,這樣的文本框和按鈕瀏覽到該文本文件是始終不變,那麼它只是改變了其不同的文本文件被加載在它們下面的數據。

我的問題是我所有的代碼都在我的「form1.cs」中,當我嘗試更新usercontrol中的代碼時,它會引發有關保護級別的錯誤。

我的問題是,我用來打開和讀取日誌文件的代碼是一個FileSystemWatcher。該代碼必須位於usercontrol.cs文件中,還是可以位於form1.cs文件中,如果可以放在form1.cs文件中,該如何填充文本框或其他任何類型的字段用戶控件?

我嘗試:

myControl.textbox1.Text = "Test"; 

我從form.cs代碼這樣做的,之後讀取一行的日誌,它相匹配的某些特定的詞組,但它只是說,保護水平是錯誤的並不會工作。我將usercontrol上的所有東西都定義爲public,但顯然我沒有正確地考慮這個問題。

我必須以某種方式「包含」form1.cs上的usercontrol.cs嗎?我一直在試圖研究這個,但是我找不到任何能夠幫助我的事情,所以要麼a)其真正的明顯,我只是沒有得到它或b)我做的事情完全錯誤,根本不理解。

也許groupBox的最適合我在做什麼?用戶控件是否被設計爲獨立於自己的代碼工作,而不是被打開和關閉的東西?

我來自一個PHP/Web背景,所以我想這樣想怎麼變成DIV的可見和不可見取決於發生了什麼。也許usercontrols不這樣工作,不應該與主窗體交互,並應該有自己的代碼?

如果需要,我可以提供代碼,但這更多的是理解概念問題,而不是代碼問題。一旦我明白它應該如何行事,我大概可以弄清代碼。

編輯: 下面是一些代碼,顯示了我想學的東西。我已將其簡化爲不包含FileWatcherSystem,因爲兩者都生成相同的錯誤。

我有Form1.cs和裏面,我很確定我的UserControl2這僅僅是一個用戶控件框和名爲「textBox1的」

UserControl2 myControl = new UserControl2(); 

文本框此控件加載到PANEL1這是在Form1的.cs。 我也在form1上有一個按鈕。CS,當我點擊它,我試圖填補textBox1的字「測試」

的代碼看起來是這樣的:

private void button1_Click(object sender, EventArgs e) 
    { 
     myControl.textBox1.Text = "Test"; 
    } 
在這種情況下

,「textBox1的」從上面的紅色下劃線和當你將鼠標懸停在它的錯誤是:

"UserControl2.textBox1" is inaccessible due to its protection level. 

我可以用按鈕來成功運行下面的命令:

panel1.Controls.Clear(); 

這將清除面板上的預加載控件(myControl),所以我相信我開始瞭解如何使控件在面板內出現/消失,但我仍然無法獲取form1.cs代碼來進行交互與UserControl2.cs文件中的控件一起使用。

+0

您能否發佈實際的異常消息,我懷疑您的錯誤是由於跨線程訪問引起的。也就是說,一個控件(用戶或其他)只能從UI線程訪問,但是你的'FileSystemWatcher'正在使用backgound線程來完成它的工作。 – CodingGorilla

回答

1

請確保您的用戶控件中的textBox1具有「public」訪問修飾符,而不是「private」或「protected」,在其中定義。

爲了幫助理解這個概念,您的用戶控件是它自己的類。 textbox1是此類的成員,因此只有您的課程才能訪問它,除非它被標記爲公開。 (如果它受到保護,那麼繼承自用戶控件的類也可以訪問它,但在這裏並沒有真正相關。)

+0

哦,我明白了。我不得不在文本框本身的屬性上改變它。請參閱,我只是將.cs文件中的代碼公開而不是私有。我從未意識到控制本身也必須公之於衆。非常感謝!! – DerekConlon