今天某位網友在使用Menu控制項時碰到一個例外訊息:
Can't select a disabled or unselectable menu item
(無法選取停用的或無法選取的功能表項目)
案發現場大概是這樣的:這位朋友在MenuItemClick的時候,把選取到的MenuItem.Selectable設為false,然後再選另一個MenuItem,這個時候就會拋出這個例外了。
由於之前用TreeView的時候有遇過某個Node的Value重複,而浪費了許多時間在Debug的經驗。所以直覺就認為:MenuItem的Value有重複。經過測試後,的確,MenuItem的Value只要重複就會造成這種錯誤。
<asp:Menu ID="Menu1" runat="server" onmenuitemclick="Menu1_MenuItemClick">
<Items>
<asp:MenuItem Text="新增項目1" Value="1"></asp:MenuItem>
<asp:MenuItem Text="新增項目1" Value="1"></asp:MenuItem>
<asp:MenuItem Text="新增項目2" Value="2"></asp:MenuItem>
</Items>
</asp:Menu>
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
e.Item.Selectable = false;
}
只要這樣寫,點個幾下就會跳錯誤了。
不過這位朋友似乎不認為這是主因,於是我又追了一下。這才發現原來還有另一個情況會報錯,就是在程式碼裡面新增MenuItem。簡化之後的程式碼大致上如下:
<asp:Menu ID="Menu1" runat="server" onmenuitemclick="Menu1_MenuItemClick">
</asp:Menu>
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
Menu1.Items.Add(new MenuItem("新項目1", "1"));
Menu1.Items.Add(new MenuItem("新項目2", "2"));
Menu1.Items.Add(new MenuItem("新項目3", "3"));
}
}
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
e.Item.Selectable = false;
}
這樣寫即使MenuItem的Value沒重複也一樣會跳錯誤
會錯誤的原因是在於時間點,因為PageLoad是在LoadViewState之後,而Menu控制項會在LoadViewState的時候重新建立子節點(包括SelectedItem),所以此時如果已經有某一個節點已經被設為Selectable = false的話,就會出現這個錯誤訊息。
解決方式還蠻簡單的,直接設定e.Item.Selected = false就行了。
protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) {
e.Item.Selectable = false;
e.Item.Selected = false;
}
[結論]
使用Menu控制項時,得注意以下二點:
1.Value不要重複
2.如果程式內會設定Selectable的話,得連同Selected一起設定
留言列表