2012-03-02 13 views
6

मेरे पास एक सी # WinForm एप्लिकेशन है जिसे मुझे रनटाइम पर टैबपेज जेनरेट करने की आवश्यकता है। आदर्श रूप से, मैं वीएस डिजाइनर का उपयोग करके इन टैबपेजों को डिज़ाइन करना चाहता हूं, लेकिन ऐसा लगता है कि मैं सीधे ऐसा नहीं कर सकता क्योंकि मैं इसे टूलबॉक्स से ड्रैग और ड्रॉप नहीं कर सकता (क्या कोई और तरीका है?)।सी # WinForms में कस्टम टैबपेज डिजाइन?

मेरे पास दो सामान्य टैबपेज हैं जिन्हें मैं कई बार उपयोग करूँगा। एक जिसमें एक सरल स्प्रेडशीट और कुछ टेक्स्टबॉक्स और दूसरा ग्राफ और कुछ टेक्स्टबॉक्स शामिल हैं। अंततः ये पृष्ठ अधिक जटिल हो जाएंगे। मैं ऐसा करने का सबसे अच्छा तरीका ढूंढ रहा हूं। मैं वर्तमान में केवल प्रत्येक टैब पेज के लिए कस्टम कक्षाएं बना रहा हूं और इसे टैबपेज बेस क्लास के रूप में सेट कर रहा हूं। उदाहरण के लिए:

public partial class SpreadsheetTabPage : TabPage{} 

मैंने पढ़ा है कि उपयोगकर्ता नियंत्रण के लिए एक विकल्प के कुछ फार्म प्रदान करते हैं, लेकिन मैं सच में समझ में नहीं आता कि यह मेरे विधि बनाम उपयोग करने के लाभों।

तो स्पष्ट होने के लिए, मैं जानना चाहता हूं कि आप इन कस्टम टैबपेजों को विकसित करने के लिए सबसे अच्छा तरीका क्या सोचते हैं और क्यों। प्रासंगिक होने पर कृपया मूल कोड उदाहरण प्रदान करें। मेरी विधि वास्तव में बहुत अधिक समस्याएं नहीं पैदा कर रही है, लेकिन मैं बाद में इन पृष्ठों पर चीजों को जोड़ने में मुश्किल महसूस करता हूं, विशेष रूप से डिजाइनर के उपयोग के बिना।

अग्रिम में आपकी सहायता के लिए धन्यवाद!

+0

आपके टैबकंट्रोल की प्रॉपर्टी विंडो में एक टैबपेज प्रॉपर्टी है जहां आप – Steve

+0

जैसे किसी भी टैब पेज को जोड़ सकते हैं, आप इसमें एक टैब कंट्रोल और टैबपेज जोड़ सकते हैं, लेकिन वास्तव में इसके डिज़ाइन को नहीं देख सकते हैं। यह सिर्फ अपनी कक्षा में कोडिंग और उपरोक्त की तरह गुणों को सेट करने से अलग नहीं होगा। – ImGreg

उत्तर

3

यदि आप उपयोगकर्ता नियंत्रण में अपना उपयोगकर्ता नियंत्रण बनाते हैं तो आप डिज़ाइनर को देख सकते हैं और इसे पसंद कर सकते हैं, और आप कुछ अतिरिक्त कोड जोड़ सकते हैं, और अभी भी & इसे टूलबॉक्स से इसे उपयोग करने के लिए खींच सकते हैं।

नोट: आप उपयोगकर्ता नियंत्रण (न तो अपने मैन्युअल रूप से कोडित वर्ग) नहीं देख सकते हैं आप पुनर्निर्माण जब तक अपनी परियोजना

+1

आपको सही विचार लग रहा था।मैंने यह थोड़ा अलग किया है, लेकिन मैं आपको जवाब के लिए क्रेडिट दूंगा। मैंने एक कस्टम उपयोगकर्ता नियंत्रण बनाया है और इसे मैन्युअल रूप से टैबपेज में जोड़ा है। नोट के लिए धन्यवाद, मुझे कुछ googling भी बचाया :) – ImGreg

+0

+1, आपका स्वागत है –

6

आप अपनी खुद की TabControl डिजाइनर बना सकते हैं, और कार्यक्षमता आप डिजाइन में की जरूरत को लागू पहर। यहां इस तरह के डिजाइनर के सबसे सरल संस्करण का कोड है:

using System; 
using System.Drawing; 
using System.Collections; 
using System.Windows.Forms; 
using System.Windows.Forms.Design; 
using System.ComponentModel.Design; 
using CustomTabControlExample.TabControl; 

namespace CustomTabControlExample.Design { 
    public class CustomTabControlDesigner :ParentControlDesigner { 
     DesignerVerbCollection fVerbs; 
     public override DesignerVerbCollection Verbs { 
      get { 
       if (fVerbs == null) 
        fVerbs = new DesignerVerbCollection(new DesignerVerb[] { 
         new DesignerVerb("Add Tab", OnAdd) 
         }); 
       return fVerbs; 
      } 
     } 

     void OnAdd(object sender, EventArgs e) { 
      TabPage newPage = (TabPage)((IDesignerHost)GetService(typeof(IDesignerHost))).CreateComponent(
       typeof(CustomTabPage)); 
      newPage.Text = newPage.Name; 
      ((System.Windows.Forms.TabControl)Component).TabPages.Add(newPage); 
     } 

     public override void InitializeNewComponent(IDictionary defaultValues) { 
      base.InitializeNewComponent(defaultValues); 
      for (int i = 0; i < 2; i++) 
       OnAdd(this, EventArgs.Empty); 
     } 

     protected override void WndProc(ref Message m) { 
      base.WndProc(ref m); 
      // Selection of tabs via mouse 
      if (m.Msg == 0x201/*WM_LBUTTONDOWN*/) { 
       System.Windows.Forms.TabControl control = (System.Windows.Forms.TabControl)Component; 
       int lParam = m.LParam.ToInt32(); 
       Point hitPoint = new Point(lParam & 0xffff, lParam >> 0x10); 
       if (Control.FromHandle(m.HWnd) == null) // Navigation 
        if (hitPoint.X < 18 && control.SelectedIndex > 0) // Left 
         control.SelectedIndex--; 
        else control.SelectedIndex++; // Right 
       else // Header click 
        for (int i = 0; i < control.TabCount; i++) 
         if (control.GetTabRect(i).Contains(hitPoint)) { 
          control.SelectedIndex = i; 
          return; 
         } 
      } 
     } 

     protected override void OnDragDrop(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragDrop(de); 
     } 

     protected override void OnDragEnter(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragEnter(de); 
     } 

     protected override void OnDragLeave(EventArgs e) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragLeave(e); 
     } 

     protected override void OnDragOver(DragEventArgs de) { 
      ((IDropTarget)((System.Windows.Forms.TabControl)Component).SelectedTab).OnDragOver(de); 
     } 
    } 
} 

यह एक काफी जटिल तरीके की तरह लगता है, लेकिन एक बार आप इसे जानने के लिए, आप दृश्य स्टूडियो द्वारा प्रदान की शक्तिशाली capabilites से प्रभावित हो जाएगा। आप एमएसडीएन में बहुत सारी जानकारी पा सकते हैं। यहां सबसे आम विशेषताएं वर्णित हैं: Enhancing Design-Time Support

2

मैं इस धागे को उसी प्रश्न के साथ दिमाग में आया था। समस्या के बारे में सोचने के बाद मुझे एहसास हुआ कि समाधान मुझे चेहरे पर देख रहा था। यह वास्तव में बहुत ही बुनियादी और सुरुचिपूर्ण है।

मैंने जो किया वह UserControl को TabPageLibrary नामक बनाया गया था। तदनुसार मैंने उस पर एक टैबकंट्रोल खींचा और सेट अप के आधार पर पेज जोड़ा गया। मैं फिर टैबपेज संशोधक को आंतरिक में सेट करता हूं। जब मुझे एक विशिष्ट विस्तारित टैबपेज की आवश्यकता होती है - मैं बस TabPageLibrary क्लास को कॉल करता हूं और एक विशिष्ट एप्लिकेशन के लिए आवश्यक टैबपेज को पकड़ता हूं। शायद यह आपके आवेदन के लिए काम करेंगे - यह मैं WinForm आवेदन

private void PropertiesButton_Click(object sender, EventArgs e) 
{ 
TabPageLibrary library = new TabPageLibrary(); 
TabPage propertyPage = library.PropertyPage; 
this.tabControl.TabPages.Add(propertyPage); 
} 

यह निश्चित रूप मेरी समस्या हल भर में एक विशिष्ट पूर्व कॉन्फ़िगर TabPage पुन: उपयोग करने की क्षमता दे दी।

+0

यह आश्चर्यजनक सरल था और बहुत अच्छा काम किया! धन्यवाद! –

संबंधित मुद्दे