2016-08-12 4 views
1

Проблема: Я пытаюсь получить доступ к 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 с такими вещами, как текстовые поля.

Заранее большое спасибо за ваше время и помочь

+2

Это действительно плохая идея найти элемент управления по имени в родительской форме вашего UserControl. Вместо этого вы должны создать свойство типа DataGridView для вашего 'UserControl' и назначить его с помощью кода или конструктора и использовать его в' UserControl'. –

ответ

2

Ошибка тут же, глядя вам в лицо.

Вернитесь к исходному коду. Вы получаете массив из Controls.Find() и пытаетесь рассматривать его как отдельный объект. Вероятно, вам нужен первый элемент в этом массиве, если вы знаете, что есть только один из них.

var txtClient = parentItem.Controls.Find("txtClient", true); 
var dgvClients = parentItem.Controls.Find("dgvClients", true); 
DataGridView test = dgvClients[0] as DataGridView; 
strClientName = test.CurrentRow.Cells[0].Value.ToString(); 
0

Так у вас есть несколько вопросов, давайте решать их:

  1. Find возвращает массив элементов управления:

Чтобы решить, что, вам необходимо взять первый предмет из них:

var dgvClients = parentItem.Controls.Find("dgvClients", true) 
            .FirstOrDefault() as DataGridView; 
  1. Cast является метод:

При вызове метода, необходимо с помощью paranthesis ():

.Cast<DataGridView>(); 
1

Это действительно плохая идея, чтобы найти элемент управления по имени в родительской форме вашего UserControl.

Вместо этого вы должны создать свойство DataGridView типа для вашего UserControl и назначить его с помощью кода или дизайнера и использовать его в своем UserControl.

public DataGridView ClientsGrid { get; set; } 

Вместо того чтобы полагаться на соглашение об именовании, вы полагаетесь на выбор разработчика.

Смежные вопросы