Этот вопрос уже давно задан, и, хотя у него было несколько просмотров, ответов не было. Это необычно, поскольку я получил очень хороших ответов от сообщества SO. Так что, если кто-то может дать мне обратную связь по самому вопросу, я был бы признателен. Это слишком долго? Скрывать? Проще говоря, а я просто идиот, кому что-то не хватает? Любые отзывы будут приветствоваться! На первоначальный вопрос ...
Я создаю пользовательские элементы управления для наших собственных программистов. Одним из элементов управления является вариант DataGridView, «OurToolboxList». Одной из услуг, которая должна быть предоставлена, является возможность указать на уровне соты, какие данные являются плохими. С этой целью и поскольку потребителям было легче переварить, я подключился к этой функции, предоставив «Событие» - «SetValidity / OnSetValidity».
//User will pass a list of position items telling us which elements in the grid are bad.
//The row is an integer, but the column is the name of the column. This makes it not dependent on column order.
public struct ElementPosition
{
public int row;
public String column_name;
}
private List<ElementPosition> BadElements = new List<ElementPosition>();
public delegate void SetValidity( List<ElementPosition> p_be );
public event SetValidity OnSetValidity;
Таким образом, пользователю нужно только сослаться на мой элемент управления (чтобы у него был доступ к элементу управления и его структуре "ElementPosition"), перетащить мой элемент управления на свою форму и затем дважды щелкнуть событие OnSetValidity. Мой элемент управления создает и очищает список, а затем генерирует событие, когда ему необходимо:
// GetInvalids : SetValidity / OnSetValidity
//Called when we get a new record set so we can ask which fields are good and which ones are bad.
private void GetInvalids()
{
if (OnSetValidity != null)
{
//Remove any prior "bad element" results.
BadElements.Clear();
//Call user's function to get list of bad cells.
OnSetValidity(BadElements);
}
}
В этот момент я ожидал, что функция события появится в их коде как
private void OurToolboxList1_OnSetValidity(List<ElementPosition> p_be)
{
}
или, возможно,
private void OurToolboxList1_OnSetValidity(List<OurToolbox.OurToolboxList.ElementPosition> p_be)
{
}
но вместо этого я получаю:
private void OurToolboxList1_OnSetValidity(List<T> p_be)
{
}
, который даже не скомпилируется, потому что ...
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
и
No overload for 'OurToolboxList1_OnSetValidity' matches delegate 'NCFLSToolboxList.SetValidity'
Все это имеет смысл как ошибка, но я не хочу универсального, я не хочу альтернативы / перегрузки, мне нужна моя ElementPosition в качестве типа List. НАПРИМЕР. что-то вроде
private void OurToolboxList1_OnSetValidity(List<OurToolbox.OurToolboxList.ElementPosition> p_be)
упоминалось выше.
Когда я вручную изменяю «T» на «OurToolbox.OurToolboxList.ElementPosition» (правильная структура / тип списка), все хорошо, но я не хочу, чтобы пользователь делал это каждый раз ...
Есть идеи, что происходит? Что я должен изменить, чтобы «OurToolbox.OurToolboxList.ElementPosition» попал к пользователю или изменился в элементе управления для использования универсального - в зависимости от того, что лучше? Я открыт для изменения моего подхода; это было лучшее, что я придумал до сих пор.
Спасибо всем