如何验证自定义collectioneditor中的集合?

时间:2016-02-16 17:40:27

标签: c# .net winforms propertygrid

我创建了一个自定义CollectionEditor但我想在用户点击“确定”按钮时验证我的收藏。我尝试了以下内容:

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

    return _form;
}

因此,当用户单击“确定”时,它将触发_form_Closing事件。但是当我这样做时,这是有效的:

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

Validate返回false(告诉表单不要关闭)该集合的所有现有成员都将从UI中删除。当然,集合的项目不应该从UI

中消失

我还需要打电话吗?

2 个答案:

答案 0 :(得分:0)

好的,所以它不优雅,但确实有效。

像这样获取ListBox

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

将其存储为成员变量,然后在OK按钮上处理MouseDown事件,如此

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但似乎有效。

答案 1 :(得分:0)

仍然是一个hack,但这会保留对话框的状态。 无论用鼠标还是键盘单击按钮,此方法都有效。

document.getElementById(element_id).getElementsByTagName("rect").length;

删除事件的功能来自: https://stackoverflow.com/a/91853/1698342