0

VS2010(またはそのことについてはVS2008)でスマートタグをコントロールに追加すると、VSがクラッシュします。

アクションリストには、次のデザイナーが使用されます。

internal class DataEditorDesigner : ComponentDesigner {
[...]
    public override DesignerActionListCollection ActionLists {
        get {
            var lists = new DesignerActionListCollection();
            lists.AddRange(base.ActionLists);
            lists.Add(new DataEditorActionList(Component));
            return lists;
        }
    }
}

internal class DataEditorActionList : DesignerActionList {
    public DataEditorActionList(IComponent component) : base(component) {}
    public override DesignerActionItemCollection GetSortedActionItems() {
        var items = new DesignerActionItemCollection();
        items.Add(new DesignerActionPropertyItem("DataSource", "Data Source:", "Data"));
        items.Add(new DesignerActionMethodItem(this, "AddControl", "Add column..."));
        return items;
    }
    private void AddControl() {
        System.Windows.Forms.MessageBox.Show("dpa");
    }
}

DataSourceプロパティは、次のように宣言されています。

    [AttributeProvider(typeof (IListSource))]
    [DefaultValue(null)]
    public object DataSource {
[...]

それをデバッグする方法について何かアイデアはありますか?

4

1 に答える 1

0

私は解決策を見つけました。DesignerActionListクラスにラッパープロパティを追加する必要があります。これは、実際のコンポーネントからではなく、そこから読み取られます。また、そのようなコードを書く必要があります:

internal static PropertyDescriptor GetPropertyDescriptor(IComponent component, string propertyName) {
    return TypeDescriptor.GetProperties(component)[propertyName];
}

internal static IDesignerHost GetDesignerHost(IComponent component) {
    return (IDesignerHost) component.Site.GetService(typeof (IDesignerHost));
}

internal static IComponentChangeService GetChangeService(IComponent component) {
    return (IComponentChangeService) component.Site.GetService(typeof (IComponentChangeService));
}

internal static void SetValue(IComponent component, string propertyName, object value) {
    PropertyDescriptor propertyDescriptor = GetPropertyDescriptor(component, propertyName);
    IComponentChangeService svc = GetChangeService(component);
    IDesignerHost host = GetDesignerHost(component);
    DesignerTransaction txn = host.CreateTransaction();
    try {
        svc.OnComponentChanging(component, propertyDescriptor);
        propertyDescriptor.SetValue(component, value);
        svc.OnComponentChanged(component, propertyDescriptor, null, null);
        txn.Commit();
        txn = null;
    } finally {
        if (txn != null)
            txn.Cancel();
    }
}

そしてそれを使用します:

[AttributeProvider(typeof (IListSource))]
public object DataSource {
    get { return Editor.DataSource; }
    set { DesignerUtil.SetValue(Component, "DataSource", value); }
}

その他のプロパティについても同様です。

于 2010-07-01T15:39:49.293 に答える