具有ASMX Web服务的动态下拉值的C#属性网格

时间:2011-04-08 00:54:53

标签: c# web-services serialization asmx

我遇到了一个难题,可以在标准的客户端应用程序中开发,在使用Web服务来提取信息时似乎无法复制。本质上,我的想法是我想从Web服务(例如,客户对象)下拉自定义对象,并让Web服务定义哪些字段可用。客户端收到对象后,会将其附加到PropertyGrid,以便用户可以直观地看到该对象的属性。

我的问题的第一部分有效。我可以抓取一个自定义对象并通过Web服务将其传递给客户端,它会将它们显示为我可以编辑的文本字段。我的问题在于我希望能够下载该字段的可用值列表。此列表可以是动态的(可用值取决于外部因素)。

我一直在使用并尝试通过Web服务工作的概念验证可以在下面找到。

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查找数组值并根据字典中的属性名称返回正确的集合时,将调用动态字符串转换器。

我怎么能

a)从Web服务复制这个工作? 或者,如果我不能这样做,

b)有哪些方法可以解决这个问题?

0 个答案:

没有答案