2012-03-02 30 views
6

Çalışma zamanında TabPages oluşturmam gereken bir C# WinForm uygulamasına sahibim. İdeal olarak, bu sekme sayfalarını VS tasarımcısı kullanarak tasarlamak istiyorum, fakat bunu doğrudan yapamayacağım gibi, bunu araç kutusundan sürükleyip bırakamıyorum (başka bir yol var mı?). Tasarım Özel TabPage?

Ben birçok kez kullanıyor olacak iki jenerik TabPage'ler var. Basit bir elektronik tablo ve bir çift metin kutuları ve diğeri bir grafik ve bir çift metin kutuları içeren bir. Bu sayfalar sonunda daha karmaşık hale gelecektir. Bunu yapmanın en iyi yöntemini arıyorum. Şu anda her sekme sayfası için özel sınıflar oluşturup bunu bir TabPage temel sınıfı olarak ayarlıyorum. Örneğin:

public partial class SpreadsheetTabPage : TabPage{} 

Ben kullanıcı kontrolleri alternatif çeşit sunmak okumak, ama gerçekten benim yönteme karşı kullanmaktan avantajlarını anlamıyorum.

Yani net olmak gerekirse, ben ne düşünüyorum bu özel TabPage'ler geliştirilmesi ve neden en iyi yaklaşım olduğunu bilmek istiyorum. İlgili ise lütfen temel bir kod örneği verin. Benim yöntemim gerçekten çok fazla sorun yaratmıyor, ancak bu sayfalara bir şeyler ekledikten sonra özellikle tasarımcıyı kullanmanın zor olacağını görüyorum.

Yardımlarınız için şimdiden teşekkür ederiz!

+0

TabControl'ünüzün Özellikler penceresinde, istediğiniz herhangi bir sekme ekleyebileceğiniz bir TabPages özelliği vardır. – Steve

+0

Bir tabcontrol ve tabheet ekleyebilir, ancak aslında tasarımına bakamazsınız. Bu, kendi sınıfında kodlamadan ve özellikleri yukarıdaki gibi manuel olarak ayarlamadan farklı olmaz. – ImGreg

cevap

3

Tabcontrolünüzü içeren bir kullanıcı denetimi yaparsanız, tasarımcıyı görebilir ve istediğiniz gibi tasarlayabilir ve ek bir kod ekleyebilir ve & araç kutusundan sürükleyebilirsiniz.

Not: size proje Yeniden untill size kullanıcı kontrolü (manuel olarak kodlanmış sınıf ne) göremiyorum

+1

Doğru fikre sahip gibiydiniz.Bunu biraz farklı yaptım, ama cevap için size kredi vereceğim. Özel bir usercontrol yaptım ve tabloları manuel olarak ekledim. Not için teşekkürler, ayrıca bazı googling :) – ImGreg

+0

+1, sizin hoş geldiniz –

6

Kendi TabPage'ler tasarımcı oluşturabilir ve tasarım ihtiyacınız işlevleri uygulayabilirsiniz zaman. İşte böyle tasarımcının en basit sürümü kodudur:

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); 
     } 
    } 
} 

Bu oldukça karmaşık bir yol gibi görünüyor, ama bunu öğrendiğinizde, Visual Studio tarafından sağlanan güçlü capabilites etkileneceksiniz. MSDN'de çok fazla bilgi bulabilirsiniz. İşte açıklanan en yaygın özellikler: Enhancing Design-Time Support

2

Aklımda aynı soruyla bu konuya rastladım. Sorunu düşündükten sonra çözümün bana yüzüne baktığını fark ettim. Aslında oldukça basit ve zarif. Ben TabPageLibrary denilen bir UserControl oluşturuldu What did

. Buna göre bir TabControl'i üzerine sürükledim ve istediğim kurguya göre Eklenmiş Sayfalar ekledim. Sonra TabPage değiştiricisini içime ayarlıyorum. Belirli bir genişletilmiş TabPage'ye ihtiyacım olduğunda - TabPageLibrary sınıfını çağırır ve belirli bir uygulama için ihtiyacım olan TabPage'i alırdım. belki de uygulamanız için çalışacak - Bu bana winform uygulaması Bu kesinlikle benim sorun çözüldü

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

boyunca belirli bir önceden yapılandırılmış TabPage yeniden yeteneğine verdi.

+0

Bu inanılmaz derecede basit ve harika çalıştı! Teşekkürler! –