2012-08-30 12 views
13

पर बाइंड डेटा मैं अपनी पहली विंडोज फॉर्म प्रोजेक्ट का प्रयास कर रहा हूं, जो पहले पूरी तरह से वेब आधारित था और कुछ मुद्दों का सामना कर रहा था। मैं ऑब्जेक्ट्स की एक सूची को टैबकंट्रोल पर बांधना चाहता हूं और इसे टैब बना सकता हूं और फिर प्रत्येक टैब के क्लिक ईवेंट से डाटाबेस वैल्यू एक्सेस कर सकता है।विंडोज फॉर्म टैबकंट्रोल

वस्तु मैं बाध्य करने के लिए इच्छुक हूँ

public class TreeNodeItem 
{ 
    private NTree<string> node; 

    public TreeNodeItem(NTree<string> node) 
    { 
     this.node = node; 
    } 

    public string Value 
    { 
     get { return this.node.data; } 
    } 
} 

NTree नोड एक वस्तु में एक नोड का प्रतिनिधित्व करता है कि एक वृक्ष संरचना में मॉडल डेटा। मैं सूची में प्रत्येक ऑब्जेक्ट के लिए एक टैब बनाना चाहता हूं जिसमें वैल्यू प्रॉपर्टी टैब टेक्स्ट प्रॉपर्टी से जुड़ी हो। अन्य पोस्ट नियंत्रण की आइटम्ससोर्स संपत्ति के लिए बाध्यकारी का उल्लेख करते हैं, लेकिन विजुअल स्टूडियो मुझे यह संपत्ति नहीं दे रहा है।

किसी भी मदद की सराहना की जाएगी।

चीयर्स

स्टीवर्ट

+2

हर बार जब मैं कर दिया है:

public class TabControlBind { public TabControlBind(TabControl tabControl) { // Create a new TabPageCollection and bind it to our tabcontrol this._tabPages = new TabControl.TabPageCollection(tabControl); } // Fields private ObservableList<TreeNodeItem> _treeNodeItems; private TabControl.TabPageCollection _tabPages; // Properties public ObservableList<TreeNodeItem> TreeNodeItems { get { return _treeNodeItems; } set { if (_treeNodeItems != value) { _treeNodeItems = value; _treeNodeItems.OnPropertyChanged += OnPropretyChanged; OnPropretyChanged(null, null); } } } public TabControl.TabPageCollection TabPages { get { return this._tabPages; } } // Events private void OnPropretyChanged(object sender, PropertyChangedEventArgs e) { if (sender == null) // If list got set { // Remove existing tabpages this._tabPages.Clear(); // Loop through all items inside the ObservableList object and add them to the Tabpage foreach (TreeNodeItem _treeNodeItem in this._treeNodeItems) { TabPage tabPage = new TabPage() { Text = _treeNodeItem.Value, Tag = _treeNodeItems }; this._tabPages.Add(tabPage); } } else if (sender is object[]) // If only one (or multiple) objects have been changed { // Get OldItems and NewItems object[] changedItems = (object[])sender; // Remove OldItems if (changedItems[0] != null) { foreach (dynamic oldItems in (IList)changedItems[0]) { foreach (TabPage tab in this._tabPages) { if (tab.Text == oldItems.Value) { this._tabPages.Remove(tab); break; } } } } // Add OldItems if (changedItems[1] != null) { foreach (dynamic newItems in (IList)changedItems[1]) { TabPage tabPage = new TabPage() { Text = newItems.Value, Tag = newItems }; this._tabPages.Add(tabPage); } } } } } 

यह है कि यह कैसे उपयोग करने पर एक नमूना है:

public class ObservableList<T> : ObservableCollection<T> { public ObservableList() : base() { CollectionChanged += new NotifyCollectionChangedEventHandler(nObservableCollection_CollectionChanged); } public event PropertyChangedEventHandler OnPropertyChanged; void nObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (OnPropertyChanged != null) { OnPropertyChanged(new object[] { e.OldItems, e.NewItems }, null); // Call method to let it change the tabpages } } } 

अब, हम एक सहायक वर्ग हमें ट्रैक रखने में मदद करता है कि बनाने के लिए ऐसी स्थिति का सामना करना पड़ा, मैं या तो कस्टम नियंत्रण का निर्माण करूंगा (मेरे 5 साल के काम के दौरान बॉक्स में से एक को नहीं देखा है) या डेटा का प्रतिनिधित्व करने का एक और तरीका ढूंढें। पूर्व। वृक्षारोपण नियंत्रण – Marty

+0

यह दुनिया में करना सबसे आसान काम है ... यदि आप 'Winforms' के बजाय' WPF' का उपयोग कर रहे थे। यदि आप Winforms में निहित नहीं हैं, तो मैं इसके बजाय WPF का उपयोग करने का सुझाव दूंगा। मैंने अक्सर अपने दृश्य मॉडल के साथ टैब और टैब पेज सामग्री में डेटा बाइंडिंग की है। यदि wpf एक विकल्प है तो मैं एक उदाहरण प्रदान कर सकता हूं। –

+0

@NathanA मुझे पता है, काश मैं WPF का उपयोग कर रहा था क्योंकि यह बहुत आसान होगा अगर मैं था, हालांकि मैं WinForms – Rachel

उत्तर

2

ठीक है, मैं की बाध्यकारी बहुत जरूरी था कि अनजान था। हालांकि मैंने कभी विंडोज़ फॉर्म एप्लिकेशन में ऐसा कुछ नहीं देखा है, मैंने एक कक्षा बनाने का फैसला किया है जो हमारे लिए यह करता है।

यह ट्रैक रखने के लिए ObservableCollection<T> का उपयोग करता है ताकि इसकी सूची में कोई वस्तु/संपत्ति बदल दी गई हो।

TabControlBind tabControlBinder; 
    ObservableList<TreeNodeItem> treeNodeItems; 

    private void btnAdd_Click(object sender, EventArgs e) 
    { 
     // This will automatically update the TabControl 
     treeNodeItems.Add(new TreeNodeItem(new NTree<string>() { data = "Test3" })); 
    } 

    private void frmMain_Load(object sender, EventArgs e) 
    { 
     // Create a new list object an add items to it 
     treeNodeItems = new ObservableList<TreeNodeItem>(); 
     treeNodeItems.Add(new TreeNodeItem(new NTree<string>() { data = "Test" })); 
     treeNodeItems.Add(new TreeNodeItem(new NTree<string>() { data = "Test2" })); 

     // Create a new instance of the TabControlBind class, set it to our TabControl 
     tabControlBinder = new TabControlBind(tabControl); 
     tabControlBinder.TreeNodeItems = treeNodeItems; 
    } 
+1

यह प्रश्न * बाइंडेज संग्रह को बाध्यकारी वस्तुओं के संग्रह में बाध्य करने का तरीका ढूंढ रहा है और उन्हें इस तरह के कोड-बैक में मैन्युअल रूप से टैब पेज बनाने के बजाय ऑटो-जेनरेट और ऑटो-अपडेट प्राप्त करें। – Rachel

+0

मेरा उत्तर फिर से देखें plea.se –

+0

अद्यतन के लिए धन्यवाद। मैंने अपना डाउनवोट हटा दिया है और यह देखने के लिए परीक्षण करेगा कि यह काम करता है या नहीं। मैंने आशा की थी कि कस्टम नियंत्रण के बिना इसे पूरा करने का एक आसान तरीका होगा, हालांकि ऐसा लगता है कि यह मामला नहीं होगा। धन्यवाद :) – Rachel