2016-02-16 7 views
1

Я создал пользовательский CollectionEditor, но я хочу проверить свою коллекцию, когда пользователь нажимает кнопку «ОК». Я попытался следующие:Как проверить коллекцию в пользовательском сборнике?

protected override CollectionForm CreateCollectionForm() 
{ 
    _form = base.CreateCollectionForm();       
    _form.FormClosing += _form_FormClosing; 

    return _form; 
} 

Так что, когда пользователь нажимает кнопку OK он запускает событие _form_Closing. Это работает, однако, когда я делаю это:

private void _form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = !Validate();      
} 

И Validate возвращает false (говоря форму, чтобы не закрывать) все существующие элементы коллекции будут удалены из UI. Разумеется, предметы коллекции не должны исчезать с UI?

Есть ли что-то еще, что мне нужно позвонить?

+0

К сожалению, CollectionForm не предназначен для такого рода обмана. Фактически, он опустошает правый бокс, когда вы нажимаете ok, независимо от того, как (а также настройте свой объект с тем, что было в этом списке). Вы можете попытаться включить/отключить кнопку ok (которая является _form.AcceptButton) в зависимости от вашего контекста, но для этого вам нужно реагировать на изменение, а не ждать, пока пользователь нажмет кнопку ok. –

+0

Ouch. Это грязно. Это потребует значений по умолчанию для элементов в коллекции, которые действительны, и в этом случае они никогда не будут действительны. О, хорошо, это дает мне возможность продолжить. – mxcolin

+0

Я не думаю, что есть способ захватить нажатие кнопки OK. – mxcolin

ответ

0

ОК, так что это не элегантный, но он работает.

Получить ListBox как так

_listBox = _form.Controls[0].Controls[4] as ListBox; 

хранить его как переменную, а затем обработать событие MouseDown на кнопку OK, как так

Button btnOK = _form.AcceptButton as Button;    
btnOK.MouseDown += btnOK_MouseDown; 

Затем создайте список или массив объектов в класс и скопировать их в массив на MouseDown (вы не можете сделать MouseClick, поскольку к тому времени они исчезли).

void btnOK_MouseDown(object sender, MouseEventArgs e) 
{ 
    _objects = new List<object>(); 

    foreach (object listItem in _listBox.Items) 
    { 
     _objects.Add(listItem); 
    }   
}  

Тогда на Form_Closing, если коллекция не проходит проверку, то добавить их обратно.

if(!CheckValidEntities(_value as IEnumerable<Entity>)) 
{ 
    e.Cancel = true; 

    foreach (object listItem in _objects) 
    { 
     _listBox.Items.Add(listItem); 
    }      
} 

Я не люблю его, и это немного Hacky, но это, кажется, работает.