我是使用樹視圖的新手,我希望能夠確保樹視圖只能檢查一個子節點,並且如果有人試圖檢查多個然後停止檢查事件並取消選擇所有父節點和子節點。我會如何去做這件事?到目前爲止,這是我得到的,但它的表現古怪。有什麼建議麼?檢查TreeView中檢查的節點數
更新:爲了澄清一些事情,這是一個雙贏的形式treeview和父節點是一個類別,每個類別可以包含多個項目。我只希望用戶能夠一次從類別中選擇一個類別和一個項目。
private void tvRecipes_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
int checkedNodeCount = 0;
if (e.Node.Parent != null && !e.Node.Parent.Checked)
e.Cancel = true;
else
{
foreach (TreeNode node in tvRecipes.Nodes)
{
if (node.Checked)
++checkedNodeCount;
if (checkedNodeCount > 2)
{
MessageBox.Show("Only one recipe can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
}
}
}
經過一番混亂之後,我想出了我之後的解決方案。我已在下面發佈它:
private bool CheckNumOfSelectedChildern(TreeViewEventArgs e)
{
bool Valid = true;
int selectedChildern = 0;
foreach (TreeNode node in tvRecipes.Nodes)
{
if (node.Checked)
{
foreach (TreeNode child in node.Nodes)
{
if (child.Checked)
++selectedChildern;
}
}
}
if (selectedChildern > 1)
{
MessageBox.Show("Only one recipe per category can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Node.Checked = false;
e.Node.Parent.Checked = false;
Valid = false;
}
return Valid;
}
private bool CheckNumOfSelectedParents(TreeViewEventArgs e)
{
bool Valid = true;
int selectedParent = 0;
foreach (TreeNode root in tvRecipes.Nodes)
{
if (root.Checked)
++selectedParent;
}
if (selectedParent > 1)
{
MessageBox.Show("Only one recipe category can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Node.Checked = false;
Valid = false;
}
return Valid;
}
private void tvRecipes_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Parent != null && !e.Node.Parent.Checked)
e.Cancel = true;
else if (e.Node.Checked)
{
foreach (TreeNode child in e.Node.Nodes)
{
if (child.Checked)
e.Cancel = true;
}
}
}
private void tvRecipes_AfterCheck(object sender, TreeViewEventArgs e)
{
if (CheckNumOfSelectedParents(e))
{
if (e.Node.Parent != null && e.Node.Parent.Checked)
{
if (e.Node.Checked)
{
if (CheckNumOfSelectedChildern(e))
{
RecipeDs = RetrieveRecipe.FillRecipeDs(e.Node.Text);
DataBindControls();
}
}
else
{
RemoveLabelsFromLayout();
RemoveDataBindings();
RecipeDs.Clear();
this.Refresh();
}
}
}
}
@Nathan,嗨,我看你接受了我的答案只能選擇一個節點,其對於你的問題來說,這是一個長期的「評論」。我不確定我的「長評論」是否構成「答案」值得接受,所以請,如果您得到「更好的答案」,請毫不猶豫地選擇它。再次,我可以(溫和地)鼓勵你澄清一下你的問題。最好, – BillW 2009-12-31 04:05:35
@Nathan,有幾個問題:1.通過設計,最終用戶無法檢查或取消選中類別節點? 2.如果用戶可以檢查一個類別(根)節點:但是不在檢查的類別節點中選擇一個項目(子節點):這是一個錯誤條件嗎? 3.只有檢查一個子節點的行爲纔會自動檢查你剛檢查過的子節點的父節點的根節點。 4.如果允許取消選中某個類別節點,並且在其父節點(類別)節點內選中了一個節點節點,那麼當我取消選中該節點ndoe時:類別節點(父節點)也必須取消選中? – BillW 2010-01-01 03:28:04
@Nathan,嗨,一旦我們確切地知道類別節點(無父節點,根節點)能做什麼和不能做什麼,這種情況可以很容易地用一個或兩個布爾標誌來管理,或者也許只有使用兩個對當前檢查的類別節點(無父母,根)和當前檢查的項目節點(子節點)的引用。最好的, – BillW 2010-01-01 03:48:04