2016-02-16 243 views
1

我已經創建了一個自定義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

不幸的是,CollectionForm不是爲這種欺騙而設計的。實際上,當你按下ok時,它會清空右側的列表框,不管怎樣(也可以用列表框中的內容來設置你的對象)。您可以嘗試根據您的上下文來啓用/禁用OK按鈕(這是_form.AcceptButton),但這需要您對更改作出反應,而不是等待用戶按下OK按鈕。 –

+0

Ouch。這很混亂。這將需要集合中有效的項目的默認值,在這種情況下,它們永遠不會有效。哦,這給了我一些繼續。 – mxcolin

+0

我不認爲有一種方法可以捕獲被點擊的確定按鈕。 – mxcolin

回答

0

行,所以它不是優雅的,但它確實工作。

獲取像這樣

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

商店它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); 
    }      
} 

我不喜歡它,它是一個小哈克,但它似乎工作。