2015-09-09 13 views
1

我有一個自定義控件,包含一個TreeView,一個帶有幾個按鈕的工具欄和一個文本框。如何在UI更改時正確導航對象列表?

然後,我有一個類Issue有幾個stringbool性能(最重要的string IDstring[] files)以及一個Projects類,其中包含2 List<Issue>,其他的一些特性,並與該列表交互的一些方法。

TreeViewProject.ID顯示爲「父」節點,將Issue.ID顯示爲「子」節點。 Textbox顯示當前選定的Issue子節點的files屬性。

我不知道在用戶選擇TreeView中的不同項目時,如何在讀取/寫入數據時瀏覽我的Project.IssueList1Project.IssueList2

目前,在TreeView_AfterSelect事件中,我找到Issue在列表中,並設置textbox1.Lines = issue.files然後在Textbox_TextChanged事件中,我指定Lines值回issue.files。這是功能性的,一切正常,但我不喜歡它。它感覺馬虎和「哈克」。

99.9%的時間,用戶複製粘貼一個或多個文件路徑到UI中,所以它不像每次他們輸入內容時觸發事件,但我仍然不喜歡這種方法。

有沒有辦法將控件綁定到對象,並讓框架類型負責遍歷列表和更新UI?我想這是ORM的目的,但我不確定是否有類似的內置。

+0

我認爲一個文本框可能是你的'string [] files'錯誤的用戶控件。一種方法是使用'BindingList '作爲文件和'Listbox'作爲控件,然後將'BindingList'設置爲'Listbox'的'Datasource'。 – Koryu

+0

我必須看看'BindingList',我不熟悉那個對象。我剛剛使用了「文本框」,因爲它似乎是最簡單,最「自由」的數據輸入形式。作爲更新部署實用程序的一部分,該應用程序的一般用途是簡單地將SVN提交日誌中的文件列表複製並粘貼到應用程序中。 – sab669

+0

看來這個帖子回答你的問題,如果你把它標記爲接受並投票贊成,這將是非常棒的:) –

回答

1

這是我已經實施的完整解決方案,希望對您有用。

此解決方案基於使用BindingSource及其DataSourceDataMember屬性來創建主 - 細節數據綁定和。

下面是步驟:

1定義你的類

public class Project 
{ 
    public string Id { get; set; } 
    public List<Issue> Issues { get; set; } 
} 

public class Issue 
{ 
    public string IssueId { get; set; } 
    public List<IssueFile> Files { get; set; } 
} 

public class IssueFile 
{ 
    public string Name { get; set; } 
} 

2-創建窗體 這種設計創建窗體:

  • 將一個TreeView
  • 把一個BindingSourceName設置爲projectBindingSource
  • BindingSourceName設置爲issuesBindingSource,並DataSource設置爲projectBindingSource,並DataMember設置爲Issues
  • BindingSourceName設置爲filesBindingSourceDataSource設置爲issuesBindingSourceDataMember集到Files
  • DataGridViewDataSource設置爲filesBindingSource
  • 將一個TextBox(DataBindings)Text綁定設置爲issuesBindingSource - IssueId

enter image description here

3-加載數據到樹並執行數據

加載數據綁定到您的數據源和樹:

private void Form_Load(object sender, EventArgs e) 
{ 
    var projects= new List<Project>(); 

    //get data of projects from whenever you want and fill the list 

    this.projectBindingSource.DataSource = projects; 
    projects.ToList().ForEach(p => 
    { 
     var projectNode = new TreeNode(p.Id); 
     //Put project in tag of project node 
     projectNode.Tag = p; 
     p.Issues.ToList().ForEach(i => 
      { 
       var issueNode = new TreeNode(i.IssueId); 
       //Put issue in tag of issue node 
       issueNode.Tag = i; 
       projectNode.Nodes.Add(issueNode); 
      }); 
     this.treeView1.Nodes.Add(projectNode); 
    }); 
} 

樹4-手柄AfterSelect事件
手柄樹AfterSelect事件,如果選擇的節點是一個問題的節點,設定你的綁定源目前的項目:

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
{ 
    if (e.Node.Parent != null) 
    { 
     var project = e.Node.Parent.Tag as Project; 
     this.projectBindingSource.Position = this.projectBindingSource.IndexOf(project); 

     var issue = e.Node.Tag as Issue; 
     this.issuesBindingSource.Position = this.issuesBindingSource.IndexOf(issue); 
    } 
} 

5截圖

enter image description here

+0

哇,非常感謝。很長的帖子。在我實際測試這條路線之前,需要一點點,因爲我還有一些事情需要我先處理,但是再次感謝。 – sab669