2010-07-06 46 views
24

có ai có thể cho tôi biết cách thêm nút đóng trong mỗi tab trong việc sử dụng tabControl trong C# không? i kế hoạch sử dụng nút pic để thay thế [x] trong tab của tôi ..Nút đóng trong tabControl

cảm ơn bạn

+0

[TabControl với Đóng và Add Button] (http://stackoverflow.com/a/36900582/3110834) –

+0

[nút Close cho TabPages của Right To Left TabControl] (http://stackoverflow.com/a/34509304/3110834) –

Trả lời

46

Nếu không có phát sinh một lớp, đây là một đoạn gọn gàng: http://www.dotnetthoughts.net/implementing-close-button-in-tab-pages/

Thiết lập thuộc tính DrawMode của Điều khiển tab cho OwnerDrawFixed. Thuộc tính này sẽ quyết định xem hệ thống hoặc nhà phát triển có vẽ phụ đề hay không. Thêm mã trong sự kiện DrawItem của Tab Control - Sự kiện này sẽ được gọi để vẽ từng Trang tab.

//This code will render a "x" mark at the end of the Tab caption. 
e.Graphics.DrawString("x", e.Font, Brushes.Black, e.Bounds.Right - 15, e.Bounds.Top + 4); 
e.Graphics.DrawString(this.tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + 12, e.Bounds.Top + 4); 
e.DrawFocusRectangle(); 

Bây giờ để thực hiện thao tác nút gần, chúng ta cần thêm mã sau vào sự kiện MouseDown của điều khiển Tab.

//Looping through the controls. 
for (int i = 0; i < this.tabControl1.TabPages.Count; i++) 
{ 
    Rectangle r = tabControl1.GetTabRect(i); 
    //Getting the position of the "x" mark. 
    Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7); 
    if (closeButton.Contains(e.Location)) 
    { 
     if (MessageBox.Show("Would you like to Close this Tab?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 
     { 
      this.tabControl1.TabPages.RemoveAt(i); 
      break; 
     } 
    } 
} 
+3

Điều này xứng đáng được bình chọn nhiều hơn. Nó thực sự đã giúp tôi. Lưu ý phụ: Sử dụng 'tabControlBottom.SizeMode = TabSizeMode.Fixed;' và 'tabControlBottom.ItemSize' để đặt chiều rộng và chiều cao của tab. –

+0

Không chắc chắn nếu mã là lỗi hoặc tôi chỉ làm sai. Tôi đang sử dụng mã chính xác như thế này (cắt và dán, thậm chí!), Các tab riêng lẻ không tính đến bất động sản bổ sung cho nút "x" và như vậy, tab chỉ thực sự đủ lớn để giữ văn bản (chữ cuối cùng của văn bản và lớp phủ 'x' lẫn nhau) – Beta033

+2

Thêm một vài khoảng trống vào cuối mỗi chuỗi mà bạn chuyển làm tên cho tab. Điều đó sẽ luôn dành nhiều không gian cho 'x'. – Karlovsky120

5

Thêm vào các câu trả lời khác ... tại sao lặp lại tất cả các tab trên sự kiện nhấp chuột khi chúng tôi chỉ có thể phát hiện tab hiện tại với .SelectedIndex và .SelectedTab?

Giống như vậy:

private void tabControl1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Rectangle r = tabControl1.GetTabRect(this.tabControl1.SelectedIndex); 
    Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7); 
    if (closeButton.Contains(e.Location)) 
    { 
     this.tabControl1.TabPages.Remove(this.tabControl1.SelectedTab); 
    } 
} 

gì có thể xảy ra là, thời điểm bạn bấm vào một tabPage đóng nó, nó cũng được chọn, do đó cho phép các nút đóng để đóng tabPage đúng. Đối với tôi nó hoạt động nhưng hãy thực hiện điều này với sự cẩn thận mặc dù như tôi không hoàn toàn chắc chắn về những hạn chế có thể (câu đầu tiên của tôi không phải là một câu hỏi tu từ hoàn toàn vì tôi mới đến. Net ...).

+0

Một vấn đề nhỏ với mã này là khi bạn có nhiều tab được mở và bạn có chúng trên nhiều hàng tab , nếu bạn cố gắng đóng một tab trên hàng khác với hàng hiện tại của các tab, thì mã này sẽ chỉ kích hoạt hàng của các tab có chứa tab chúng tôi muốn đóng và chọn tab đó, nhưng không đóng nó. Tôi chỉ báo cáo điều này, không có thời gian để kiểm tra nó hơn nữa, nhưng tôi cảm thấy giải pháp không phải là quá khó. –

+0

Chưa thử nghiệm điều này, nhưng tôi thấy những gì có thể có thể là một vấn đề. Nếu bạn có nhiều tab đang mở, (Tab A, B và C). Nếu bạn đang làm việc trong tab C và quyết định bạn muốn đóng tab A mà không chọn (mở) nó.Sẽ nhấp vào đóng X trong tab A không đóng tab C vì nó đóng tab đã chọn? – DDuffy

+0

@DD không, nó sẽ không đóng tab sai trong ứng dụng của tôi. Trong trường hợp của tôi thời điểm bạn nhấp vào X bạn cũng chọn tab, do đó, một trong những chính xác sẽ được đóng lại. –

0

Hãy thử mã này:

private Point _imageLocation = new Point(13, 5); 
     private Point _imgHitArea = new Point(13, 2); 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; 
    tabControl1.DrawItem += tabControl1_DrawItem; 
    CloseImage = WindowsFormsApplication3.Properties.Resources.closeR; 
    tabControl1.Padding = new Point(10, 3); 
     } 


    private void TabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
     { 
      try 
      { 
       Image img = new Bitmap(CloseImage); 
       Rectangle r = e.Bounds; 
       r = this.tabControl1.GetTabRect(e.Index); 
       r.Offset(2, 2); 
       Brush TitleBrush = new SolidBrush(Color.Black); 
       Font f = this.Font; 
       string title = this.tabControl1.TabPages[e.Index].Text; 

       e.Graphics.DrawString(title, f, TitleBrush, new PointF(r.X, r.Y)); 

       if (tabControl1.SelectedIndex >= 1) 
       { 
        e.Graphics.DrawImage(img, new Point(r.X + (this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X), _imageLocation.Y)); 
       } 
      } 
      catch (Exception) { } 
     } 


private void TabControl1_Mouse_Click(object sender, System.Windows.Forms.DrawItemEventArgs e) 
{ 

TabControl tc = (TabControl)sender; 
Point p = e.Location; 
int _tabWidth = 0; 
_tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X); 
Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex); 
r.Offset(_tabWidth, _imgHitArea.Y); 
r.Width = 16; 
r.Height = 16; 
if (tabControl1.SelectedIndex >= 1) 
{ 
    if (r.Contains(p)) 
    { 
     TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex]; 
     tc.TabPages.Remove(TabP); 
    } 

} 
} 

Nhìn vào this đoạn mã