【发布时间】:2019-07-21 09:53:27
【问题描述】:
我有一个 WinForms TreeView 来表示我的计算器数据。当我读入我的数据时,我创建了我的 TreeView 并用相应的对象标记每个 TreeView 节点。下面是一个示例 TreeView。
SUM
SUM
TIMES
UnitsSold
UnitPrice
IncomeFromContracts
NEGATIVE SUM
Rent
Wages
TIMES
UnitsSold
UnitMaterialCost
我从以下数据结构创建 TreeView:
class Operand {
bool IsNegated {get; set;}
}
class Operator : Operand {
enum OperatorEnum { SUM, DIFFERENCE, TIMES }
OperatorEnum MyEnum {get; set;}
IList<Operand> Children {get; set;}
}
class VariableName : Operand {
string Name {get; set;}
}
每个 TreeNode 都使用相应的操作数进行标记。当 TreeView 中的项目被选中时,标记的项目会显示在面板中,以便您可以更改其属性。例如。当我选择一个项目时,您会看到一个复选框,您可以在其中设置 IsNegated 值。我已经成功地将该控件绑定到 Operand 对象,使用:
negateCheckBox.DataBindings.Add("Checked", requirementTree.SelectedNode.Tag, "IsNegated");
单击复选框会适当地更新基础数据,但不会导致 TreeView 刷新其数据,因此即使项目的 ToString() 方法的返回值已更改(它现在以“NEGATIVE”为前缀),因为已经使用该字符串创建了 TreeNode,所以它不会更新。
我还有一些“添加”和“删除”按钮,它们可以在 TreeView 中创建其他节点并删除它们,但这些都是手动操作的——更新底层数据结构,然后重建整个 TreeView(这会导致视图刷新,这样我就可以验证我的其他绑定是否正常工作)。
我需要采取哪些步骤才能不手动填充 TreeView,而是完全绑定到我的数据结构,以便立即反映此类更改?似乎有很多方法可以在 WinForms 中绑定数据,我不清楚哪些适用于哪些情况。
非常感谢您的帮助!
【问题讨论】:
-
TreeView 节点不支持数据绑定,所以需要手动处理。您可以find the node with tag 并反映更改。
-
也不要依赖 UI 事件,点击按钮,依赖数据结构的事件。