prasannanirmale Ответов: 2

Как отобразить tablelayoutpanel или datagridview в дочерней форме в windows forms?


пожалуйста, обратитесь по ссылке проблема — ImgBB[^] для скриншота проблемы. Я использую visual studio 2019 community edition. Также есть Fontawesome.Библиотека Sharp установлена в моем проекте. Пожалуйста, помогите, я новичок в среде windows forms. Любая помощь будет очень признательна. Если вам трудно понять проблему, пожалуйста, попросите более подробную информацию.

Спасибо!!
Прасанна - разработчик и предприниматель .Net

Пожалуйста обратитесь к этой ссылке для получения подробного изображения я использовал оба проблема-Screen2 — ImgBB[^]. Я использовал как tablelayoutpanel, так и datagridview contro. Оба показывают одну и ту же проблему.

Что я уже пробовал:

Я попытался использовать TableLayoutPanel и элемент управления DataGridView, чтобы увидеть, сохраняется ли проблема. Но он сохранился и с DataGridView. Я попытался добавить как tablelayoutpanel, так и DataGridView программно, но все равно безуспешно. Вы можете увидеть темные линии в TableLayoutPanel, как показано на скриншоте по ссылке --> проблема — ImgBB[^].

Это код, который я пробовал

using System;
using System.Drawing;
using System.Windows.Forms;
using FontAwesome.Sharp;
namespace ModernUIApp.Forms
{
    public partial class MainForm : Form
    {
        private IconButton currentBtn;
        private Panel leftBorderBtn;
        private Color currentColor;
        private Form currentChildForm;
        public MainForm()
        {
            InitializeComponent();
            leftBorderBtn = new Panel();
            leftBorderBtn.Size = new Size(7, 40);
            //panel5.Controls.Add(leftBorderBtn);
            //Form
            this.Text = string.Empty;
            this.ControlBox = false;
            this.DoubleBuffered = true;
            this.MaximizedBounds = Screen.FromHandle(this.Handle).WorkingArea;

        }
        
        //Methods
        
        private void OpenChildForm(Form childForm)
        {
            if (currentChildForm != null)
            {
                currentChildForm.Close();
            }
            currentChildForm = childForm;
            childForm.TopLevel = false;
            childForm.FormBorderStyle = FormBorderStyle.None;
            childForm.Dock = DockStyle.Fill;
            // childForm.Font.Size = 10
            pnlDesktop.Controls.Add(childForm);            
            pnlDesktop.Tag = childForm;
            childForm.BringToFront();
            childForm.Show();

        }

        
        private void button1_Click(object sender, EventArgs e)
        {
            //ActivateButton(sender, RGBColors.color2);
            OpenChildForm(new ConferencesForm());
        }
    }
}

Richard MacCutchan

Вам нужно показать код, который создает форму, так как здесь никто не может догадаться, что вы написали.

prasannanirmale

Я обновил вопрос с помощью кода. Спасибо за быстрый ответ. Действительно ценить.

Richard MacCutchan

Извините, я не вижу связи между этим кодом и вашей картинкой или не понимаю, в какой части содержится проблема.

prasannanirmale

I have two forms MainForm and ConfernceForm. Mainform is main screen which has leftpanel, toppanel and middlepanel. middle panel named "pnlDesktop" is used to display child form "conferenceform" in this case. In Image you can see TableLayoutPanel to the right side of the middle panel. I have mentioned "problem" word in red color there. If you look pass button 3, button 4 etc. you don't see cell border. It has disappeared for unknown reason to me. I have used drag and drop controls to design most of the form.What you see in the picture is all static for now. And in the childform I have two panels "Contacts" and "Conferences". In contact panel I have TableLayoutPanel which display problem after loading in the MainForm. I hope this helps.

Спасибо!

prasannanirmale

Спасибо @Dave Kreskowiak, я использую форму для загрузки childform, это правда. Можем ли мы создать весь экран в качестве пользовательского элемента управления в соответствии с моим требованием? Я попытался использовать datagridview в следующей панели только для того, чтобы проверить возможности рисования элемента управления. Это показывает ту же проблему. Вы можете проверить https://ibb.co/9m5DDNN эта ссылка для другого скриншота прилагается.Я также добавил эту ссылку к описанию моего вопроса.Любая дополнительная помощь будет весьма признательна. Спасибо!

Dave Kreskowiak

Да, вы можете создать целую "панель" элементов управления в UserControl.

Если все, что вы делаете, - это выкладываете кучу кнопок в сетке, использование DataGridView-плохая идея, поскольку это тяжелый элемент управления, который имеет гораздо больше возможностей, чем вам нужно для этого.

TableLayoutPanel-гораздо лучший выбор, к тому же он не будет рисовать линии сетки по умолчанию.

2 Ответов

Рейтинг:
2

Dave Kreskowiak

TableLayoutPanel не будет рисовать линии между элементами управления, в то время как DataGridView будет. Итак, есть что-то в этом "детском контроле", который вы делаете, но не показываете в своем вопросе.

TableLayoutPanel, как следует из названия, добавляет дополнительные возможности компоновки в форму для элементов управления. На самом деле это не "видимый" элемент управления, а расширение элементов управления, которые он содержит.

Кроме того, ваша "дочерняя форма" на самом деле должна быть вовсе не формой, а пользовательским контролем. Формы приходят с большим багажом, с которым вы не хотели бы иметь дело, пытаясь использовать его в качестве контроля, как вы, кажется, делаете.


BillWoodruff

TableLayoutPanel имеет семь вариантов для CellBorderStyle: шесть вариантов будут рисовать границы :)

Dave Kreskowiak

Да, но границы по умолчанию отключены.

Maciej Los

5ed!

BillWoodruff

Мой голос изменился на #1: дальнейшее чтение этого решения и комментарий DK заставили меня поверить, что это на самом деле вводящее в заблуждение "решение", которое DK, по каким-то причинам, вряд ли обновит, основываясь на фактическом поведении TableLayoutPanel в WinForms.

1 новый TLP, сброшенный на форму, по умолчанию имеет 2 строки и 2 столбца: представление времени разработки показывает контуры на 4 ячейках. Вы можете сразу перетащить элементы управления в эти ячейки.

1a для отображения границ ячеек ... как и договаривались ... вам действительно нужно установить стиль CellBorderStyle во время разработки или во время выполнения.

2 Если вы показываете TLP без содержимого (без элементов управления в ячейках): во время выполнения вы видите только пустой серый прямоугольник на экране ... если только вы не установили CellBorderStyle для TLP ... что может быть сделано во время разработки или во время выполнения.

3 хотя в TLP отсутствует настройка времени разработки свойства BorderStyle TLP (спросите Microsoft !), она может быть задана в коде следующим образом:

tableLayoutPanel1.Для Свойства Borderstyle = Borderstyle Стиль Окна.Fixed3D;

4 вы также можете установить свойство заполнения для TLP во время разработки.

Типичное использование и поведение во время проектирования/выполнения TLP и DataGridView настолько различны, что я думаю, что они несопоставимы. TLP не поддерживает привязку данных !

Смотрите: https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/best-practices-for-the-tablelayoutpanel-control

Dave Kreskowiak

Да, вы можете включить границы, но он не показал, что это делается в коде. Все, кажется, использует поведение по умолчанию, так что же я должен изменить?

То, что он опубликовал, на самом деле не показывает никаких признаков того, что он может разместить строки, о которых он говорит. Я не знаю, откуда они берутся. Мое "решение" было просто предложением использовать TLP над DGV.

Но, вау. Привет, познакомься с мочой.

BillWoodruff

Очень разочаровывающий ответ, который по-своему так же неточен, как и искажение как первоначального вопроса, так и моего объяснения вам, почему я проголосовал против вашего "решения", как и Ваше технически неточное "решение"."

Вы слишком умны, чтобы реагировать подобным образом, путая мою попытку технической точности и полезности для операции с атакой ad hominem.

Рейтинг:
1

BillWoodruff

TableLayoutPanel имеет семь вариантов CellBorderStyle: используйте один из шести вариантов, которые рисуют границы, если вы хотите, чтобы он выглядел как сетка.

Как сказал Дэйв, не используйте форму, в которой Вы можете использовать UserControl.

В вашем коде pnlDesktop.Controls.Add(childForm)

0 ваш код не определяет pnlDeskTop

1 childForm-это просто общая, пустая форма: она не будет иметь никакого содержимого, кроме стандартных украшений формы и элементов управления заголовком: зачем нужна пустая форма во время выполнения ?,

Вам нужно немного поэкспериментировать с такими элементами управления, как DataGridView и TableLayoutPane, сориентироваться. Изучите создание UserControl и то, как вы включаете взаимодействие с его контейнером времени выполнения (родительский элемент управления).

Если пользователь создает несколько новых экземпляров элемента управления/компонента во время выполнения, что это за содержимое ?

И уточните и отредактируйте свой вопрос здесь.


Maciej Los

5ed!