我遇到了一个难题,可以在标准的客户端应用程序中开发,在使用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)有哪些方法可以解决这个问题?