我正在实现向树视图添加一些数据的功能-MVP(应用程序由Word功能区(VSTO)+ C#代码库组成)。下面是我的代码。
private ElementTreeNode LoadElement(Element element, ElementTreeNode parent = null)
{
ElementTreeNode loadElement;
ElementTreeNode node;
//Add a node to the TreeView that represents the element.
loadElement = Add(text: GetElementNodeText(element.Name), parent: parent);
loadElement.Element = element;
//Add a node to the TreeView for conditions
if (element.TSS.Conditions.Count > 0)
{
Add(text: "Conditions", parent: loadElement).Conditions = element.TSS.Conditions;
}
//Add a node to the TreeView control for each image within the element.
foreach (Image image in element.FrameSets.Active.Images)
{
Add(text: GetImageNodeText, parent: loadElement).Image = image;
}
//Call this procedure recursively to add any nested elements.
foreach (Element objElement in element.FrameSets.Active.Elements)
{
LoadElement(element: objElement, parent: loadElement);
}
return loadElement;
}
添加方法:
private ElementTreeNode Add(string text, string key = "", ElementTreeNode parent = null)
{
try
{
TreeNode node = null;
//Create a random key if a key is not specified.
if (key.Length == 0)
{
key = "ElementTreeNode_" + GetRandomNumber();
}
//Add a node to the TreeView control.
if (parent == null) //..............point 1
{
node = treeView.Nodes.Add(key: key, text: text);
}
else // ..............point 2
{
node = parent.Node.Nodes.Add(key: key, text: text);
}
//Add a new ElementTreeNode object to this collection. It will have the same key as objNode.
ElementTreeNode objNode = new ElementTreeNode(node);
elementTreeNodesCollection.Add(key: key, value: objNode);
return objNode;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + Environment.NewLine + "ElementTreeNodes.Add","MyApp,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
创建随机数:
public long GetRandomNumber()
{
Random rnd = new Random();
return rnd.Next();
}
问题是,在我的测试运行中,此代码首先将父元素添加到树视图中,然后添加到集合(Dictionary<string, ElementTreeNode> elementTreeNodesCollection
)中。在下一步中,“条件”树节点将作为父节点下的子节点添加到树节点。当我尝试将其添加到时elementTreeNodesCollection
,出现以下错误。
具有相同密钥的项目已被添加
最大的问题是,如果我在Add方法中将调试点放在第1点或之前(整个代码库中没有其他调试点),则不会收到任何错误,并且已将项目正确添加到树视图和集合中。
但是,如果我在第2点或之后添加调试点,则会收到错误消息。另外,当没有断点时,我也会收到此错误。
我尝试将密钥设置为递增数字,然后代码运行正常。但是我需要在这里使用随机数,因为LoadElement方法涉及递归。这个问题与随机数生成功能有关吗?还是其他情况?我真的被困在这里。
有人知道我在这里做错了什么吗?
先感谢您。
我强烈怀疑问题出在您的GetRandomNumber()
方法上,具体取决于当前时间。如果您连续多次调用它,最终将得到相同的号码。
如果您在两次通话之间稍等片刻(例如,由于在断点处暂停),您将获得不同的随机数。
我建议最简单的选择是使数字根本不是随机的-保留一个计数器,该计数器在每次需要创建新密钥时都会增加。或者您可以使用Guid.NewGuid()
并将其转换为字符串或类似名称。
如果您确实想使用Random
,请创建一个Random
用于所有调用的实例,但是要注意这Random
不是线程安全的;如果您需要跨多个线程进行工作,那么一切都会变得更加复杂。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句