【问题标题】:How can I create an index accessor for a List<T> Property I have in a custom class?如何为自定义类中的 List<T> 属性创建索引访问器?
【发布时间】:2011-10-13 11:37:23
【问题描述】:

示例如下:

    /// <summary>
    /// Collection of SednaTreeViewItems used to populate the SednaTreeView.
    /// </summary>
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public List<SednaTreeViewItem> TreeNodes
    {
        get { return treeNodes; }
        set 
        {
            ultraTree.Nodes.Clear();
            treeNodes = value;
            foreach (var item in treeNodes)
            {
                UltraTreeNode node = new UltraTreeNode(item.ValueMember, item.DisplayMember);
                ultraTree.Nodes.Add(node);
            }

            if (treeNodes.Count() > 0)
                ultraTree.ActiveNode = ultraTree.Nodes[0];
        }
    }

    /// <summary>
    /// SednaTreeViewItem that is currently selected in the SednaTreeView.
    /// </summary>
    public SednaTreeViewItem SelectedItem
    {
        get 
        {
            if (ultraTree.SelectedNodes != null)
            {
                var node = ultraTree.SelectedNodes[0];
                SednaTreeViewItem item = new SednaTreeViewItem(node.Key, node.Text);
                return item;
            }
            else
                return null;                
        }

        set 
        {
            ultraTree.ActiveNode = ultraTree.Nodes[value.ValueMember];
        }
    }

我想以这种方式使用我的控件。例如,有人想在运行时设置选定的树视图节点,我想要这样的东西:

treeViewInvestors.SelectedItem = treeViewInvestor.TreeNodes[userIdKey];

其中 userIdKey 是在幕后已经存在的唯一键。

基本上,有没有办法为我的属性创建索引“[]”访问器?

【问题讨论】:

    标签: c# winforms class indexing properties


    【解决方案1】:

    如果暴露的节点集合属性是一个列表(已经有一个 int 类型的索引器),并且您需要另一个类型的索引器,那么您可以将树节点集合暴露为具有其他类型的列表的子类索引器:

    public class NodeList : List<Node>
    {
       public TNode this[Key key] 
       {
           get { return nodes.Where(n => n.Key == key).SingleOrDefault(); }
       }
    }
    

    那么你可以通过两种索引访问

    var nodeByKey = treeViewInvestor.TreeNodes[key];
    var nodeByIndex = treeViewInvestor.TreeNodes[index].
    

    【讨论】:

      【解决方案2】:

      实现indexer 属性如:

      public SednaTreeViewItem this[int index]//or public T this[int index]
      {
         get { return ultraTree[index]; }
         set { ultraTree[index] = value; }
      }
      

      【讨论】:

      • 不完全是,这让我可以像treeViewInvestor[key] 一样打电话,但我想要的是:treeViewInvestor.TreeNodes[key]。有什么想法吗?
      • @Sergio:TreeNodes 是什么?它是一个自定义类吗?如果是,则在其中实现该索引器。
      • 它是 SednaTreeView 类中的一个属性。
      • 我失去了你的踪迹。 TreeNodes 不是其类型为List&lt;SednaTreeViewItem&gt; 的属性吗?所以你可以随时拨打treeViewInvestor.TreeNodes[userIdKey];
      猜你喜欢
      • 2011-05-26
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多