Кнопка закрытия в tabControl

есть ли кто-нибудь, кто может сказать мне, как добавить кнопку закрытия на каждой вкладке, используя tabControl в C #? Я планирую использовать кнопку pic для замены [x] на моей вкладке.

Спасибо

Без получения classа, здесь есть аккуратный fragment: http://www.dotnetthoughts.net/implementing-close-button-in-tab-pages/

Задайте свойство DrawMode элемента управления вкладкой OwnerDrawFixed. Это свойство решает, будет ли система или разработчик рисовать надписи. Добавьте код в событие DrawItem элемента управления 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(); 

Теперь для закрытия действия кнопки нам нужно добавить следующий код в событие MouseDown элемента управления 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; } } } 

Добавление к другим ответам … зачем повторять все вкладки при щелчке мыши, когда мы можем просто обнаружить текущую вкладку с помощью .SelectedIndex и .SelectedTab?

Вот так:

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

Кажется, что, как только вы нажимаете на tabPage для его закрытия, он также выбирается, поэтому кнопка закрытия закрывает правую вкладку. Для меня это работает, но, пожалуйста, возьмите это с особой осторожностью, хотя я не совсем уверен в возможных недостатках (мое первоначальное предложение не было совершенно риторическим вопросом, так как я новичок в .Net …).

Попробуйте этот код:

  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(rX, rY)); if (tabControl1.SelectedIndex >= 1) { e.Graphics.DrawImage(img, new Point(rX + (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); } } } 

Посмотрите на этот fragment кода

  • Запуск нескольких streamов пользовательского интерфейса
  • Создание WinForms TextBox ведет себя как адресная строка вашего браузера
  • Как создать 5 кнопок и назначить отдельные события кликов динамически?
  • Как настроить системное меню формы Windows?
  • Перенос слов для ярлыка в Windows Forms
  • ComboBox.SelectedText не дает мне SelectedText
  • Изменение цвета текста в WinForms RichTextBox
  • Загрузка изображения из относительного пути в Windows Forms
  • Windows Forms: Как скрыть кнопку Close (x)?
  • Клиент сервера посылает / получает простой текст
  • Как сравнить два богатых текстовых поля и выделить символы, которые были изменены?
  • Interesting Posts

    как отображать изображения, сохраненные в папке sdcard в android

    Что такое reflection и почему оно полезно?

    Использование распространения с повторяющимися идентификаторами для строк

    Как я засеваю случайный class, чтобы избежать дублирования случайных значений

    Алгоритм заполнения треугольника

    Сколько соединений сокетов может обрабатывать веб-сервер?

    Создание нескольких файлов журналов различного содержания с помощью log4j

    Журналирование событий блокировки экрана

    Параллельные streamи, коллекторы и безопасность streamов

    Java – class.getResource возвращает null

    rsync: как я могу настроить его для создания целевого каталога на сервере?

    Как получить контроль над курсором мыши?

    Android-эмулятор – проблема с созданием учетных записей пользователей

    Имя файла журнала, в котором загружается процесс загрузки

    Как определить, находится ли точка в правой или левой части строки

    Давайте будем гением компьютера.