0

我的 winform 能够存储输入到文本框中的值,然后当在树视图上选择适当的节点时,这些值会返回到它们输入的文本框中。但是,我在尝试修改我的程序以便用户可以覆盖他们存储的值时遇到问题。

这是它目前的设置方式:

private void tagTextBox_TextChanged(object sender, EventArgs e)
{
    _screenTag = tagTextBox.Text;

    if (_selectedNode > -1)
    {
        Node n = _nodeList[_nodeList.Count - 1];
        n.Tag = _screenTag;
    }
}

上述方法首先将输入的值存储到我的tagTextbox中。接下来,我将其传递给包含节点列表的字典(自定义类,不要与树视图节点混淆,抱歉):

foreach (KeyValuePair<string, Entry> pair in n.nodeDictionary)
{             
    if (pair.Key == "Tag ")
    {
        tagTextBox.Text = (string)pair.Value.value;
    }
}

当我的树视图上的任何节点(不是我的类节点,树节点(对不起,如果那令人困惑))被选中时,将调用上述方法。这将带回存储的值并将其重新输入正确的文本框。

现在,这是我当前尝试更改和更新与我的屏幕关联的标记文本框上的值的尝试:

private void tagTextBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    // Update the name when enter is pressed
    if (e.KeyCode == Keys.Enter)
    {
        if (_selectedNode > -1)
        {
            HV_Screen s = _screenList[_screenList.Count - 1];
            s.Tag = _screenTag;
        }
    }
}

但它不起作用。我已经检查过了,这个方法被调用但它没有更新。我知道这通常是一件简单的事情,但我在这里真的很困惑,我花了 8 个小时试图弄清楚如何在没有运气的情况下解决这个问题。

谁能告诉我我做错了什么/错过了什么?

4

1 回答 1

0

我不确定这是为了达到什么目的

if (_selectedNode > -1)
{
    Node n = _nodeList[_nodeList.Count - 1];
    n.Tag = _screenTag;
}

不应该是这样的:

if (_selectedNode > -1)
     _nodeList[_selectedNode].Tag = _screenTag;

这也许吧?不过我不确定,很难看出你想要实现什么。原因是您根本没有使用 _selectedNode,只是知道更多。你如何设置你的_selectedNode,这可能会影响。我误解了吗?

我会重写循环:

foreach (KeyValuePair<string, Entry> pair in n.nodeDictionary)
{             
    if (pair.Key == "Tag ")
    {
        tagTextBox.Text = (string)pair.Value.value;
    }
}

作为:

tagTextBox.Text = n.nodeDictionary.Where(x => x.Key.Equals("Tag")).value;

它可能必须是这样的(我正在做这件事):

tagTextBox.Text = n.nodeDictionary.Where(x => x.Key.Equals("Tag")).FirstOrDefault().value;

我这样做是因为对我来说更容易阅读和操作恕我直言,但真的取决于你。明显的优势,我只是将 7 行减少到 1 行。其次,可读性没有受到影响。它读起来很好:在字典=>中查看键==标记=>从列表中获取第一个=>获取其值的位置。

于 2013-05-22T13:48:00.640 回答