2010-12-22 4 views
0

확장 Treeview를 쓰고 있는데, TreeNode 클래스에 몇 가지 추가 속성이 있습니다.확장 된 treenode/treeview, 거의 그렇지만

코드가 준비되었지만 현재 다음 코드를 완전히 고수하고 있습니다. 이 시점에서 내가 시도하는 모든 것은 (다른) 예외를 초래합니다 ...

어쩌면 누구나 어떻게 나아갈 지 아이디어가 있습니까? 내가 다른 프로젝트에 트 리뷰를 이동 한 후} 더 이상

 
using System; 
using System.ComponentModel; 
using System.ComponentModel.Design; 
using System.ComponentModel.Design.Serialization; 
using System.Drawing.Design; 
using System.Globalization; 
using System.Reflection; 
using System.Runtime.Serialization; 
using System.Windows.Forms;

namespace MyProject.Forms { public class MenuTreeView : TreeView { public MenuTreeView() { // }

[Editor(typeof(MenuTreeNodeCollectionEditor), typeof(UITypeEditor))] //[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public new TreeNodeCollection Nodes { get { return base.Nodes; } } } [Serializable] [DefaultProperty("Text")] [TypeConverter(typeof(MenuTreeNodeConverter))] public class MenuTreeNode : TreeNode, ISerializable { private string description = ""; public MenuTreeNode() : base() { // } public MenuTreeNode(string text) : base(text) { // } public MenuTreeNode(string text, string description) : base(text) { this.description = description; } public MenuTreeNode(string text, MenuTreeNode[] children) : base(text, children) { // } public override object Clone() { object clone = base.Clone(); MenuTreeNode node = clone as MenuTreeNode; if (node != null) { node.Description = Description; return node; } else return clone; } void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) { Serialize(info, context); } protected override void Deserialize(SerializationInfo info, StreamingContext context) { Description = info.GetString("Description"); base.Deserialize(info, context); } protected override void Serialize(SerializationInfo info, StreamingContext context) { info.AddValue("Description", Description); base.Serialize(info, context); } [DefaultValue("")] public string Description { get { return description; } set { description = value; } } } public class MenuTreeNodeConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type type) { if (type == typeof(string)) { return true; } return base.CanConvertFrom(context, type); } public override bool CanConvertTo(ITypeDescriptorContext context, Type type) { if (type == typeof(InstanceDescriptor) || type == typeof(string)) { return true; } return base.CanConvertTo(context, type); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo info, object value) { if (value != null && value is string) { string[] items = ((string)value).Split(','); return new MenuTreeNode(items[0], items[1]); } return base.ConvertFrom(context, info, value); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo info, object value, Type type) { MenuTreeNode node = value as MenuTreeNode; if (value != null) { if (type == typeof(string)) { return node.Text + "," + node.Description; } else if (type == typeof(InstanceDescriptor)) { ConstructorInfo constructor = typeof(MenuTreeNode).GetConstructor(new Type[] { typeof(string), typeof(string) }); return new InstanceDescriptor(constructor, new object[] { node.Text, node.Description }, true); } } return base.ConvertTo(context, info, value, type); } } public class MenuTreeNodeCollectionEditor : CollectionEditor { public MenuTreeNodeCollectionEditor(Type t) : base(t) { // } protected override Type CreateCollectionItemType() { return typeof(MenuTreeNode); } protected override Type[] CreateNewItemTypes() { return new Type[] { typeof(MenuTreeNode) }; } protected override object CreateInstance(Type itemType) { if (itemType == typeof(MenuTreeNode)) { return new MenuTreeNode(); } return base.CreateInstance(itemType); } protected override string GetDisplayText(object value) { MenuTreeNode node = value as MenuTreeNode; if (node != null) { return "MenuTreeNode: " + node.Text; } return base.GetDisplayText(value); } }

[편집] 을 알고하지 않는, 모두가 잘 간다. 이유를 묻지 마세요 ...

하지만 디자이너는 추가 된 각 노드에 대해 로컬 변수를 만들지 않으므로 텍스트 및 설명 속성 만 저장됩니다. 이것을 어떻게 할 수 있습니까?

[편집] 마지막으로, 나는 작동하도록했습니다! 덕분에 : http://netcode.ru/dotnet/?lang=&katID=30&skatID=283&artID=7827

해결 방법은 TypeConvertor에서 typeof (string)을 제거하고 유형이 InstanceDescriptor 인 경우 기본 생성자를 반환하는 것입니다.

+0

어떤 유형의 예외가 표시됩니까? 저기 봐야 할 것이 많아 예외는 너를 도울지도 모른다. – Steven

+0

'노드'속성의 코드 생성에 실패했습니다. 오류 : '개체 참조가 개체의 인스턴스로 설정되지 않았습니다.' –

+0

클래스를 다른 프로젝트로 옮기고 거기에 대한 참조를 추가하면 정말 이상합니다. 그러나 모두 같은 프로젝트에서 오류가 나타납니다!?!? –

답변

관련 문제