我创建了一个自定义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
?
我还需要打电话吗?
答案 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