Проблема: Я пытаюсь получить доступ к DataGridView моей Windows Form (ClientSearch.cs
) из User Control (AttachmentOptions.cs
), чтобы я мог использовать полученные данные.Из UserControl в форме, Как я могу получить доступ к DataGridView родительской формы?
История вопроса:ClientSearch.cs
- это форма окна, которую можно воспитывать по электронной почте в надстройке Outlook. Он позволяет пользователю искать клиента (и их соответствующую папку в системе) для архивирования электронной почты или вложений. AttachmentOptions.cs
- это элемент управления пользователя, который создается для каждого вложения в электронном письме, так что каждое вложение будет иметь одну и ту же группу параметров архивации.
Я предпринял несколько шагов, чтобы решить эту проблему, и у меня все больше проблем. В случае, если я усугубил ситуацию, я покажу мои шаги:
Оригинал:
var txtClient = parentItem.Controls.Find("txtClient", true); //This works as I want
var dgvClients = parentItem.Controls.Find("dgvClients", true);
DataGridView test = dgvClients; //Error appears on this line
strClientName = test.CurrentRow.Cells[0].Value.ToString();
Это ошибка:
Error 1 Cannot implicitly convert type 'System.Windows.Forms.Control[]' to 'System.Windows.Forms.DataGridView'
Fix Попытка 1:
var txtClient = parentItem.Controls.Find("txtClient", true);
var dgvClients = (DataGridView)parentItem.Controls.Find("dgvClients", true).Cast<DataGridView>; //Error on this line
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();
Ошибка:
Error 20 Cannot convert method group 'Cast' to non-delegate type 'System.Windows.Forms.DataGridView'. Did you intend to invoke the method?
Фикс Попытка 2:
var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
var dgvClients = (DataGridView)dataGridInfo; //Error is here
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();
Ошибка:
Error 20 Cannot convert type 'System.Windows.Forms.Control[]' to 'System.Windows.Forms.DataGridView'
Фикс Попытка 3:
var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
DataGridView dgvClients = dataGridInfo.Cast<DataGridView>; //Error is here
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();
Ошибка:
Error 20 Cannot convert method group 'Cast' to non-delegate type 'System.Windows.Forms.DataGridView'. Did you intend to invoke the method?
Фикс Попытка 4:
//var dgvClients = parentItem.Controls.Find("dgvClients", true);
var dataGridInfo = parentItem.Controls.Find("dgvClients", true);
DataGridView dgvClients;
dgvClients = (DataGridView)dataGridInfo; //Error is here
DataGridView test = dgvClients;
strClientName = test.CurrentRow.Cells[0].Value.ToString();
Ошибка:
Error 20 Cannot convert type 'System.Windows.Forms.Control[]' to 'System.Windows.Forms.DataGridView'
Я чувствую, что я иду по кругу и ухудшение моего кода, как я иду (следовательно, почему я показал предыдущие версии) в попытке поговорить с DataGridView. Кажется, что C# не нравится преобразовывать эти два типа вместе, так есть ли другой способ ссылаться на объект DataGridView?
Для справки parentItem
относится к ранее объявленному ClientSearch
, и это работает для общения с ClientSearch.cs
с такими вещами, как текстовые поля.
Заранее большое спасибо за ваше время и помочь
Это действительно плохая идея найти элемент управления по имени в родительской форме вашего UserControl. Вместо этого вы должны создать свойство типа DataGridView для вашего 'UserControl' и назначить его с помощью кода или конструктора и использовать его в' UserControl'. –