2013-01-18 68 views
3

解決方案無法顯示編程設置的WinForms文本框的值

我現在踢自己在這個,但你會在下面的代碼,請注意,我使用Form4一個參數的構造函數。 C#中參數化構造函數的標準過程是在聲明之後使用:this()(我認爲,至少對於Forms而言)。這首先調用未參數化/默認構造函數,其中包含設置窗體及其控件的InitializeComponent()

InitializeComponent()最應該是在參數的構造函數,如果你已經使用:this(),因爲它重新初始化與「新」的控制你的形式。這會導致您的表單和控件的模糊狀態,以及我得到的奇怪行爲。

原始的問題

我在我想的控件(包括文本框),以對第一視圖的初始值的形式。這些值在Form的構造過程中來自SQL語句,所以我不能使用Form設計器。這個表單的元素/控件也是從幾乎相同的表單複製粘貼的,因爲那個是'Add',而這個是'編輯'

問題是這樣的:使用調試器顯示我成功地從SQL,並且設置textbox.Text成功,但是當顯示錶單時,它不反映所做的更改。答案在這裏:https://stackoverflow.com/a/7830769/1655707意味着該值可以簡單地設置(大概在初始化或負載期間)。

我已經嘗試過在初始化過程中,在Load事件和Shown事件中進行這些工作,而沒有一個工作。調用Refresh()Application.DoEvents()也沒有做任何事。有什麼我失蹤?某些阻止此文本框正確更新/顯示的事件?複製粘貼控件是否有意想不到的副作用?

我嘗試以這種方式設置的控件都沒有顯示改變的值,但是文本框是最簡單的,因爲它沒有混亂的索引。

public Form4(int collIDFromParent, string collNameFromParent): this() 
    { 
     InitializeComponent(); 

     retCollID = collIDFromParent; 
     retCollName = collNameFromParent; 

     //Initialize these here so they activate on first use0 
     button1.DialogResult = DialogResult.None; 
     button2.DialogResult = DialogResult.Cancel; 

     //PopulateEditData goes first for potential SQL failure 
     PopulateEditData(); 

     textBox6.Text = "TEST"; 
    } 

    private void Form4_Load_1(object sender, EventArgs e) 
    { 
     textBox1.Text = "TEST"; 
    } 

    private void Form4_Shown_1(object sender, EventArgs e) 
    { 
     textBox2.Text = "TEST"; 
    } 

是的,他們設置不同的文本框,但他們都沒有工作,所以它沒有什麼區別。

典型的文本框更改處理程序。有人可能會認爲,它現在寫的方式可能會引起某種重新設置,但是評論說一條線不會改變我所關心的行爲。

private void textBox6_TextChanged_2(object sender, EventArgs e) 
    { 
      retCollName = textBox6.Text; 
    } 
+1

複製/粘貼控件時,您是使用設計器還是從代碼執行此操作? – CodingGorilla

+0

@編碼設計器,以保持佈局,而不必手動指定位置 –

+1

你看過設計器代碼(通常隱藏在一個區域內),以確保它更新所有內容以引用粘貼的表單*到*並且還沒有引用您從*粘貼*的形式? – CodingGorilla

回答

1

通過函數之間的簡單更改(如添加和編輯),表單的核心功能不會改變。你試圖處理的兩個函數之間唯一的核心區別是一個新的對象和一個現有的對象。正因爲如此,單一表格會更好,而不是兩種單獨的表格。它還節省了大量的工作,並且是OOP的核心之一。

我建議的另一件事是在創建表單之前檢索數據。創建一個數據對象,用於保存從數據庫中檢索的所有屬性。爲該數據類提供一個Load方法,該方法接受您要查找的記錄的任何標識符。現在您已經準備好了更輕鬆的時間。

爲了舉例說明,我將在此處設置一些默認按鈕,您的體驗可能會有所不同。 :)

AddButton_Click(//default button click parameters) { 
    Widget widget = new Widget(); 
    OpenWidgetForm(widget); 
} 

EditButton_Click(//default button click parameters) { 
    Widget widget = new Widget(); 
    // You'll use the way you have now to determine which record to load, 
    // and turn it to the id variable 
    widget.Load(id); 
    OpenWidgetForm(widget); 
} 

OpenWidgetForm(Widget widget) { 
    frmWidget frm = new frmWidget(widget); 
    frm.Show(); 
} 

該代碼將以任何形式進入添加/編輯窗體。

現在,在您添加/編輯表格,你會改變它周圍像這樣:

private Widget _widget; 

public frmWidget() { 
    Widget widget = new Widget(); 
    _widget = widget; 
    LoadWidget(); 
} 

public frmWidget(Widget widget) { 
    _widget = widget; 
    LoadWidget(); 
} 

public void LoadWidget() { 
    // go through each of the properties of your object 
    // and set the values to the Text properties of each Textbox. 
    txtName.Text = _widget.Name; 
} 

有了,你應該去的好。如果您有任何問題,請告訴我。

+0

我越來越想,當我複製粘貼控件時,會產生一些不良血液;感謝您的建議和例子!在項目進展中陷入困境,忘記了OOP的宗旨! –

+0

是的,爲了直接回答你原來的問題,最有可能的事件SOMEWHERE失去了他們的參考之間的某些聯繫。甚至可以在所有深層代碼是你永遠不想接觸的形式的部分類的另一半。只是複製這樣的表單很少會按照您希望的方式運行。 – krillgar

+1

爲了傳播信息,我解決了這個問題。它在參數化構造函數中再次調用'InitializeComponents()'。它可能仍然與複製的控件有關,但在這種情況下,它似乎主要是用戶錯誤。感謝您讓我在賽道上看到它! –

0

我做了一個快速項目來測試這個功能。所有這三個選項都成功設置了TextBox的值。你在這裏有一個問題,沒有顯示的發佈代碼。事後要麼改變TextBox值,要麼你引用了錯誤的TextBoxes。我剛剛完成了調試與我們的應用程序類似的問題。事實證明,我們以某種方式有兩組重疊的TextBoxes(我們實際使用的是一組空文本框)。

public Form1() 
    { 
     InitializeComponent(); 

     textBox1.Text = "TEST"; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     textBox2.Text = "TEST"; 
    } 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     textBox3.Text = "TEST"; 
    } 
+0

不幸的是,這不是問題在這裏,只有一組控件,將它們從他們的位置拉出顯示儘可能多。我知道還有別的東西會改變他們,但這些都是表單顯示之前的最後事件,對吧?這些事件之後是否有事件超出了我的控制範圍? –

+0

顯示的確是最後的事件。這些文本框上是否有TextChanged事件處理程序可能會更改文本?您是否在使用任何可能會更改文本的數據綁定? – Bob

+0

每個都有TextChanged處理程序,但它們是簡單的分配,就像編輯到問題中的示例一樣。不,沒有數據綁定發生(這是通過同事提出的潛在問題)。 –

0

這可能是一個更瑣碎的答案不是這個問題需要,但要確保你實際上調用Controls.Add(textBox1)。我注意到迄今沒有人提到過這一點。首先檢入設計器生成的代碼。

如果您要動態添加控件,您必須自己調用它。

+0

我再次看着設計器,並確實添加了所有這些文本框。 –

相關問題