Сетка свойств C # с динамическими раскрывающимися значениями из веб-службы ASMX - PullRequest
0 голосов
/ 08 апреля 2011

Я столкнулся с проблемой, которая может быть разработана в стандартном клиентском приложении, и я не могу воспроизвести его при использовании веб-службы для извлечения информации. По сути, идея заключается в том, что я хочу вытащить пользовательский объект из веб-службы (например, объект клиента) и сделать так, чтобы веб-служба определяла, какие поля будут доступны. Как только клиент получил объект, он присоединит его к PropertyGrid, чтобы пользователь мог визуально увидеть свойства этого объекта.

Первая часть моей проблемы работает. Я могу взять пользовательский объект и передать его клиенту через веб-сервис, и он отобразит их как текстовые поля, которые я могу редактировать. Моя проблема заключается в том, что я хотел бы иметь возможность иметь выпадающие списки доступных значений для поля. Этот список может быть динамическим (доступные значения будут зависеть от внешних факторов).

Доказательство концепции, которое я использовал и пытался заставить работать через веб-сервис, можно найти ниже.

public class TestPropertyGrid
{
    private string _text_string= "";
    private string _some_String = null;
    private string _meds = null;


    public TestPropertyGrid()
    {
        string[] ss_arr = new string[3];
        ss_arr[0] = "Zero";
        ss_arr[1] = "One";
        ss_arr[2] = "Two";

        string[] meds_arr = new string[3];
        meds_arr[0] = "Heart";
        meds_arr[1] = "Blood";
        meds_arr[2] = "Cholesterol";

        GLobalVars.Add("Meds", meds_arr);
        GLobalVars.Add("SomeString", ss_arr);
    }
    [CategoryAttribute("Basic Category")]
    public string TextString
    {
        get { return _text_string; }
        set { _text_string = value; }
    }
    [TypeConverter(typeof(DynamicStringConverter))]
    public string SomeString
    {
        get
        {
            string S = "";
            if (_some_String != null)
            {
                S = _some_String;
            }
            else
            {
                string[] arr = (string[])GLobalVars.Get("SomeString");
                if (arr.Length > 0)
                {
                    S = arr[0];
                }
            }
            return S;
        }
        set { _some_String = value; }
    }
    [TypeConverter(typeof(DynamicStringConverter))]
    public string Meds
    {
        get
        {
            string S = "";
            if (_meds != null)
            {
                S = _meds;
            }
            else
            {
                string[] arr = (string[])GLobalVars.Get("Meds");
                if(arr.Length > 0){
                    S = arr[0];
                }
            }
            return S;
        }

        set {_meds = value;}
    }


    }

    static class GLobalVars
    {
        internal static Dictionary<string, object[]> dictionary = new Dictionary<string, object[]>();

        public static object[] Get(string key)
        {
            return dictionary[key];
        }

        public static void Add(string key, object[] value)
        {
            dictionary.Add(key, value);
        }

        public static void Set(Dictionary<string, object[]> dict)
        {
            dictionary = dict;
        }

    }


    public class DynamicStringConverter : StringConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            //true means show a combobox

            return true;
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            //true will limit to list. false will show the list, 

            //but allow free-form entry

            return true;
        }

        public override System.ComponentModel.TypeConverter.StandardValuesCollection
               GetStandardValues(ITypeDescriptorContext context)
        {
            Console.WriteLine("Property Desc.name: " + context.PropertyDescriptor.Name);
            return new StandardValuesCollection(GLobalVars.Get(context.PropertyDescriptor.Name));

        }
    }

Краткое описание происходящего. У меня есть некоторые частные свойства, которые управляются через их методы Get / Set. Некоторые из которых получают значения из массива при необходимости. Преобразователь динамических строк вызывается, когда PropertyGrid ищет значения массива и возвращает правильный набор на основе имени свойства из словаря.

Как я могу

а) повторить это для работы с веб-службы? или если я просто не могу этого сделать,

б) Какие существуют подходы для решения этой проблемы?

...