解惑

解己之惑,解人之惑

标签:动态

用C#动态调用WebService

其实利用的都是前人的成果:C# – Dynamically Invoke Web Service At Runtime

这个文章的问题是没有提及需要认证的时候怎么办,但是后面很多回帖都问到了,总结下:

在读取WSDL的时候有几种方式,我使用的是:

WebClient client = new WebClient();

if (_needCredential)
{
client.Credentials = _credential;
}
Stream stream = client.OpenRead(WSDL);
XmlTextReader xmlreader = new XmlTextReader(stream);

//XmlTextReader xmlreader = new XmlTextReader(Uri);
ServiceDescriptionImporter descriptionImporter = BuildServiceDescriptionImporter(xmlreader);
Assembly library = CompileAssembly(descriptionImporter);

在真正生成WebService的Instance以后,需要设置Instance的几个Property:

if (_needCredential)
{
PropertyInfo preAuthenticate = GetRealType().GetProperty(“PreAuthenticate”);
preAuthenticate.SetValue(Result, true, null);
PropertyInfo url = GetRealType().GetProperty(“Url”);
url.SetValue(Result, Url, null);
CredentialCache cache = new CredentialCache();
Uri uri = new Uri(Url);
cache.Add(uri, “Basic”, _credential);
PropertyInfo credentials = GetRealType().GetProperty(“Credentials”);
credentials.SetValue(Result, cache, null);
}

动态排序

这个是刚刚提出的一个需求,我开始以为不能实现,但是是可以的,虽然比较麻烦。
Crystal Report Designer中可以选择用来排序的字段可以是数据库字段,也可以是Fomula字段,不能是参数字段,所以一个可行的方法就是创建一个Fomula字段,这个Fomula的任务很简单,就是根据参数的值选择字段:

if {?sortcolumn} =’ID’ then totext({DEVICEGROUPCONFIG.DG_ID},’0000000000000′)
else
{DEVICEGROUPCONFIG.DG_NAME}

需要注意的就是那个totext的使用,Fomula是没有类型的,但是要求其返回值的类型要一致,不能一会是字符串一会是数字,所以我使用了totext把数字转换为字符串,如果有日期类型,也要类似的实现。

动态设置带参数的onclick事件

本来这个应该不是什么难事,但是我们是在一个受限的情况下写代码,我们有一个RadioSelectEntry类帮助我们生成RadioButton元素,但是又没有提供设置onclick事件的方法,只能在onload里面做,但是可能有多个,我不愿意写几个一样的方法,想根据参数动态设置,这就遇到问题了,因为一般都是这样:
element.onclick=functionName;
这里的functionName就是事件处理函数,但是我的是带参数的,怎么办?呵呵,一个小技巧就可以解决:匿名函数:
    element.onclick=function() {
        functionName(param);
    };

© 2024 解惑

本主题由Anders Noren提供向上 ↑