Duplicate Key 错误,但在 运行 有调试点时不重新创建
Duplicate Key error, but not recreating when run with debug points
我正在实现一个将一些数据添加到树视图的功能 - MVP(应用程序由 Word ribbon (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;
}
}
创建 运行dom 号码:
public long GetRandomNumber()
{
Random rnd = new Random();
return rnd.Next();
}
问题是,在我的测试中运行
此代码首先将父元素添加到树视图并添加到集合中 (Dictionary<string, ElementTreeNode> elementTreeNodesCollection
)。在下一步中,将在树节点的父元素下添加一个 'conditions' 树节点作为子节点。当我尝试将它添加到 elementTreeNodesCollection
时,出现以下错误。
An item with same key has already been added
最大的问题是,如果我在 Add 方法中将调试点放在 点 1 或之前(整个代码库中没有其他调试点),我不会收到任何错误并且项目已添加到树视图和集合中。
但是如果我在 点 2 或之后添加调试点,我会收到错误。另外当没有断点时,我也会得到这个错误。
我尝试将密钥设置为递增数字,然后代码 运行 没问题。但是我需要在这里使用一个 运行dom 数字,因为 LoadElement 方法涉及递归。
这个问题和运行dom号码生成函数有关吗?或其他情况?
我真的被困在这里了。
有人知道我在这里做错了什么吗?
提前谢谢你。
我强烈怀疑问题出在你的GetRandomNumber()
方法上,这取决于当前时间。如果你连续多次调用它,你最终会得到相同的数字。
如果您在通话之间稍等片刻 - 例如由于在断点处暂停 - 您将获得不同的随机数。
我建议最简单的选择是使数字完全不是随机的 - 保留一个计数器,每次需要创建新密钥时该计数器都会递增。或者您可以使用 Guid.NewGuid()
并将其转换为字符串或类似的东西。
如果您真的想使用 Random
,请创建一个用于所有调用的 Random
实例 - 但请注意 Random
不是 [=23] =];如果你需要跨多个线程工作,一切都会变得更加复杂。
我正在实现一个将一些数据添加到树视图的功能 - MVP(应用程序由 Word ribbon (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;
}
}
创建 运行dom 号码:
public long GetRandomNumber()
{
Random rnd = new Random();
return rnd.Next();
}
问题是,在我的测试中运行
此代码首先将父元素添加到树视图并添加到集合中 (Dictionary<string, ElementTreeNode> elementTreeNodesCollection
)。在下一步中,将在树节点的父元素下添加一个 'conditions' 树节点作为子节点。当我尝试将它添加到 elementTreeNodesCollection
时,出现以下错误。
An item with same key has already been added
最大的问题是,如果我在 Add 方法中将调试点放在 点 1 或之前(整个代码库中没有其他调试点),我不会收到任何错误并且项目已添加到树视图和集合中。
但是如果我在 点 2 或之后添加调试点,我会收到错误。另外当没有断点时,我也会得到这个错误。
我尝试将密钥设置为递增数字,然后代码 运行 没问题。但是我需要在这里使用一个 运行dom 数字,因为 LoadElement 方法涉及递归。 这个问题和运行dom号码生成函数有关吗?或其他情况? 我真的被困在这里了。
有人知道我在这里做错了什么吗?
提前谢谢你。
我强烈怀疑问题出在你的GetRandomNumber()
方法上,这取决于当前时间。如果你连续多次调用它,你最终会得到相同的数字。
如果您在通话之间稍等片刻 - 例如由于在断点处暂停 - 您将获得不同的随机数。
我建议最简单的选择是使数字完全不是随机的 - 保留一个计数器,每次需要创建新密钥时该计数器都会递增。或者您可以使用 Guid.NewGuid()
并将其转换为字符串或类似的东西。
如果您真的想使用 Random
,请创建一个用于所有调用的 Random
实例 - 但请注意 Random
不是 [=23] =];如果你需要跨多个线程工作,一切都会变得更加复杂。