Я новичок в использовании древовидных представлений, и я хочу, чтобы убедиться, что в древовидном представлении проверен только один дочерний узел, и если кто-то пытается проверить более одного, то он останавливает событие проверки и отменяет выбор всех родительских и дочерних узлов. Как мне это сделать? Пока это то, что у меня есть, но это причудливо. Какие-либо предложения?Проверить количество проверенных узлов в TreeView
Обновление: Чтобы прояснить некоторые вещи, это дерево формы win, а родительский узел - это категория, и каждая категория может содержать несколько элементов. Я хочу, чтобы пользователь мог выбирать одну категорию и один элемент из категории за раз.
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();
}
}
}
}
@ Натан, Привет, я вижу, вы приняли мой ответ, это скорее длинный «комментарий», чем конкретный ответ на ваш вопрос. Я не уверен, что мой «длинный комментарий», представляющий «как ответ», заслуживает принятия, поэтому, пожалуйста, если вы получите «лучший ответ», не стесняйтесь его выбирать. Еще раз позвольте (мягко) предложить вам немного уточнить свой вопрос. best, – BillW
@Nathan, несколько вопросов: 1. по дизайну конечный пользователь не может проверить или снять отметки с узлов категории? 2. если пользователь может проверить узел категории (корневой): но не выбирает элемент (дочерний узел) в пределах выбранного узла категории: это условие ошибки? 3. Только действие проверки дочернего узла будет автоматически проверять корневой узел, который является родителем категории дочернего узла, который вы только что отметили? 4. Если мне удастся снять отметку с узла категории, и у меня есть узел элемента в его родительском (классе) узле, отмеченном, когда я снижу отметку элемента ndoe: узел категории (родительский узел) также должен быть отмечен флажком? – BillW
@Nathan, Привет, как только мы точно знаем, что можно и не может быть сделано с узлами категории (без родителя, корневыми узлами), эту ситуацию легко справиться с помощью одного или двух логических флагов или, возможно, только с помощью двух ссылки на текущий узел категории (без родителя, root) и текущий элемент узла (дочерний узел). best, – BillW