hanymet Ответов: 1

Мне нужно добавить новую вкладку в tabcontrol через пользовательский элемент управления C#


Я работаю над проектом, похожим на интерфейс Outlook, клиент загружается в левую часть с пользовательским управлением, а правая часть проекта-tabControl без tabpage,
При нажатии на пользовательский элемент управления с кнопкой для желаемого клиента tabcontrol должен добавить на него новую вкладку с информацией о клиенте.

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

<pre> public SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["CustomersApp.Properties.Settings.CustomersConnectionString"].ConnectionString);

// Load data button in Form1 
   private void button1_Click(object sender, EventArgs e)
        {
            SqlCommand cm = new SqlCommand("select TOP(20) *from customers", cn);

            try
            {
                cn.Open();
                SqlDataAdapter da = new SqlDataAdapter(cm);
                DataTable dt = new DataTable();
                da.Fill(dt);
                foreach (DataRow dr in dt.Rows)
                {
                    customer_test1 pt = new customer_test1();
                    pt.UC_fullname = dr["customer_name"].ToString();
                    pt.UC_patientid = dr["customer_id"].ToString();
                   
                    flowLayoutPanel1.Controls.Add(pt);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

// code in user control with a button

Form1 ld;
 private void AddNewTab(string tabName)
        {
            if (InvokeRequired)
            {
                Invoke(new MethodInvoker(delegate { AddNewTab(tabName); }));
            }
            else
            {
                TabPage tp = new TabPage(tabName);
                ld.tabControl1.TabPages.Add(tp);
            }
        }

 private void button1_Click(object sender, EventArgs e)
        {
            AddNewTab("test1");
            
        }

By run the application and press the button of customer there is an error appear "System.NullReferenceException:'Objecte reference not set to an instance of an object'

1 Ответов

Рейтинг:
11

Dave Kreskowiak

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

UserControl должен предоставить событие, на которое родитель может подписаться, чтобы затем родитель мог решить, что делать с уведомлением и как это сделать, например создать страницу вкладки в другом элементе управления.


hanymet

Я перетаскиваю пользовательский элемент управления ,
У меня есть обработчик событий expose для пользовательского управления и попытка добавить tabpage в tabcontrol результат в порядке :

// это мой код в пользовательском контроле
публичное мероприятие EventHandler UCButtonClick;

частная button1_Click_1 недействительным(объект отправителя, EventArgs в электронной)
{
if (UCButtonClick != null)
UCButtonClick(отправитель, e);
}

// мой код в форме
частная userControl11_UCButtonClick недействительным(объект отправителя, EventArgs в электронной)
{
TabPage tb = новая вкладка("test1");
tabControl1.Вкладки.Добавить(ТБ);
}

Но проблема заключается в том, что код загрузки клиентов, как вы можете видеть, загружает каждого клиента в новый пользовательский элемент управления(а не перетаскивает пользовательский элемент управления), поэтому как я могу связать обработчик событий click с каждым пользовательским элементом управления, чтобы открыть сведения о клиенте в новой вкладке.

Dave Kreskowiak

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

Обработчики событий предназначены для выполнения некоторого кода при возникновении события, на которое вы подписываетесь.

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

Читать https://docs.microsoft.com/en-us/dotnet/standard/events/