2017-03-22 69 views
1

主題說這一切。我的GUI是基於數據表和佈局,如:Winforms DataBindings.Add除「Current」之外還添加「Current - 1」和「Current + 1」?

(current - 1, gray) label 1/4000 label ABC 

         [ Navigate Previous button ] 
(current, black)  label 2/4000 label DEF 
         [ Navigate Next button  ] 

(current + 1, gray) label 3/4000 label GHI 

DEF採取與currName.DataBindings.Add ("Text", mybindingsource, "cname");照顧,但ABC和GHI可綁定的這種做法?

目前我的解決方法是手動程序上對mybindingsource_CurrentChanged活動的每一個調用設置的ABC和GHI的標籤,但這似乎分面值的,因爲它是如此手動和我失去了自動格式化和DBNull的處理是DataBindings.Add爲您提供免費的。

我應該做些什麼呢? (是的,我知道DataRepeater,我確實在其他形式上使用它,但它並不適合這種形式,原因是這裏太長了,而且與這些形式不相關)

+0

數據綁定可以有事件:格式化和分析。 – LarsTech

+0

我相信你現在的解決方案是好的,但是如果你對如何使用數據綁定有一個解決方法感到好奇,作爲一個選項,你可以使用不同的'BindingSource'組件來綁定控件,然後根據主綁定源的'PositionChanged'事件中的主綁定源的位置。 –

回答

1

我相信你目前的解決方案是好的,但是如果你很想知道如何使用數據綁定解決方法,作爲選項,你可以使用不同的BindingSource組件綁定控件,然後設置他們的Position根據主要綁定源的事件中主要綁定源的位置爲PositionChanged

在下面的例子中,主綁定源是currentBScurrentTextBox綁定到它。 previousTextBox顯示以前的項目和nextTextBox顯示下一個項目:

private void Form1_Load(object sender, EventArgs e) 
{ 
    var t = new DataTable(); 
    var tc = t.Clone(); 
    t.Columns.Add("C1"); 
    t.Rows.Add("A"); 
    t.Rows.Add("B"); 
    t.Rows.Add("C"); 
    t.Rows.Add("D"); 
    t.Rows.Add("E"); 
    currentBS.PositionChanged += (x, y) => 
    { 
     if (currentBS.Position == 0) 
      previousBS.DataSource = tc; 
     else 
     { 
      previousBS.DataSource = t; 
      previousBS.Position = this.currentBS.Position - 1; 
     } 
     if (currentBS.Position == currentBS.Count - 1) 
      nextBS.DataSource = tc; 
     else 
     { 
      nextBS.DataSource = t; 
      nextBS.Position = this.currentBS.Position + 1; 
     } 
    }; 
    previousBS.DataSource = tc; 
    nextBS.DataSource = tc; 
    currentBS.DataSource = t; 
    this.previousTextBox.DataBindings.Add("Text", previousBS, "C1"); 
    this.currentTextBox.DataBindings.Add("Text", currentBS, "C1"); 
    this.nextTextBox.DataBindings.Add("Text", nextBS, "C1"); 
} 
+1

比程序方法更清潔。 – amonroejj

相關問題