2012-03-02 62 views
6

Tôi có một ứng dụng WinForm C# mà tôi cần để tạo TabPages khi chạy. Lý tưởng nhất, tôi muốn thiết kế các trang này bằng cách sử dụng VS thiết kế, nhưng có vẻ như tôi không thể trực tiếp làm điều đó vì tôi không thể kéo và thả nó từ hộp công cụ (có cách nào khác không?).Thiết kế TabPage tùy chỉnh trong C# WinForms?

Tôi có hai trang tab chung mà tôi sẽ sử dụng nhiều lần. Một bảng tính chứa một bảng tính đơn giản và một vài hộp văn bản và một bảng khác có biểu đồ và một vài hộp văn bản. Những trang này cuối cùng sẽ trở nên phức tạp hơn. Tôi đang tìm phương pháp tốt nhất để làm điều này. Tôi hiện nay chỉ tạo các lớp tùy chỉnh cho mỗi trang tab và thiết lập nó như là một lớp cơ sở TabPage. Ví dụ:

public partial class SpreadsheetTabPage : TabPage{} 

Tôi đọc điều khiển người dùng cung cấp một dạng thay thế, nhưng tôi thực sự không hiểu lợi thế của việc sử dụng nó so với phương pháp của tôi.

Vì vậy, để rõ ràng, tôi muốn biết bạn nghĩ gì là cách tiếp cận tốt nhất để phát triển các trang tab tùy chỉnh này và tại sao. Vui lòng cung cấp ví dụ về mã cơ bản nếu có liên quan. Phương pháp của tôi không thực sự gây ra quá nhiều vấn đề, nhưng tôi thấy việc thêm những thứ vào các trang này sau này sẽ rất khó khăn, đặc biệt là nếu không sử dụng nhà thiết kế.

Cảm ơn sự giúp đỡ của bạn trước!

+0

Trong cửa sổ Thuộc tính của TabControl có thuộc tính TabPages nơi bạn có thể thêm bất kỳ trang tab nào bạn thích – Steve

+0

Bạn có thể thêm tabcontrol và tabpages vào nó, nhưng không thực sự nhìn vào thiết kế của nó. Điều đó sẽ không khác gì việc chỉ viết mã trong lớp riêng của nó và thiết lập các thuộc tính theo cách thủ công như trên. – ImGreg

Trả lời

3

Nếu bạn thực hiện điều khiển người dùng có chứa tabcontrol bạn có thể thấy nhà thiết kế và thiết kế theo ý muốn và bạn có thể thêm một số mã bổ sung và vẫn có thể kéo & thả nó từ hộp công cụ để sử dụng.

Lưu ý: bạn không thể nhìn thấy bạn điều khiển người dùng (không phải lớp bằng tay được mã hóa của bạn) cho đến khi bạn Rebuild dự án của bạn

+1

Bạn dường như có ý tưởng đúng.Tôi đã làm điều này một chút differenlty, nhưng tôi sẽ cung cấp cho bạn tín dụng cho câu trả lời. Tôi đã thực hiện một điều khiển người dùng tùy chỉnh và thêm nó vào các trang tab theo cách thủ công. Cảm ơn bạn đã lưu ý, cũng đã lưu cho tôi một số googling :) – ImGreg

+0

+1, chào mừng bạn –

6

Bạn có thể tạo thiết kế TabControl của riêng bạn, và thực hiện các chức năng mà bạn cần ít thiết kế thời gian. Đây là mã của phiên bản đơn giản nhất của nhà thiết kế như vậy:

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

Đây có vẻ là một cách khá phức tạp, nhưng khi bạn học nó, bạn sẽ bị ấn tượng bởi các capabilites mạnh được cung cấp bởi Visual Studio. Bạn có thể tìm thấy nhiều thông tin trong MSDN. Dưới đây là các tính năng phổ biến nhất được mô tả: Enhancing Design-Time Support

2

Tôi đã xem qua chủ đề này với cùng một câu hỏi trong đầu. Sau khi nghĩ về vấn đề tôi nhận ra giải pháp đang nhìn chằm chằm vào mặt tôi. Nó thực sự là khá cơ bản và thanh lịch.

Điều tôi đã tạo đã được tạo UserControl có tên là TabPageLibrary. Theo đó tôi kéo một TabControl vào nó và thêm trang dựa trên thiết lập tôi muốn. Sau đó tôi đặt công cụ sửa đổi TabPage thành nội bộ. Khi tôi cần một TabPage mở rộng cụ thể - tôi chỉ đơn giản gọi lớp TabPageLibrary và lấy TabPage mà tôi cần cho một ứng dụng cụ thể. Điều này đã cho tôi khả năng sử dụng lại một TabPage được định cấu hình cụ thể trong suốt ứng dụng hình thức chiến thắng

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

Điều này chắc chắn đã giải quyết được vấn đề của tôi - có lẽ nó sẽ làm việc cho ứng dụng của bạn.

+0

Điều này thật đơn giản và tuyệt vời! Cảm ơn! –

Các vấn đề liên quan