最近遇到这样一个问题:在做统计报表的时候,同一个报表需要再不同的统计方式下显示,所以把该统计报表抽出来做成了一个单独的用户控件,该用户控件中也有自己的查询条件。其中有一个查询条件是从实体库中选择实体后带出来,这是用前台脚本实现的,这样就会存在一个问题,无论在那种统计方式下选择实体,实体的信息只显示在最后一个统计方式下,如下图所示:
最后找出原因是用户控件中选择实体的实现方法是在前台写了一个函数:
function SelectOwner() {
var argumentXML = GetArgumentsXML();
var url = "../../Modules/General/Product/SelectCustomer.aspx";
var features = "dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes";
var xmlDom = showModalDialog(url, argumentXML, features);
if (null != xmlDom) {
var nodes = xmlDom.selectNodes("root/Customer");
var id = "";
var name = "";
var n = nodes.length - 1;
var re = /\s/g;
for (i = 0; i <= n; i++) {
var node = nodes(i);
id += node.attributes.getNamedItem("CustomerEntityID").value.replace(re, "") + ((i == n) ? "" : ";");
name += node.attributes.getNamedItem("CustomerName").value.replace(re, "") + ((i == n) ? "" : ";");
}
document.getElementById("<%=tbProprietor.ClientID %>").value = name;
}
return false;
}
业主单位
<asp:TextBox ID="tbProprietor" runat="server" CssClass="kpms-textboxsearch" EnableTheming="false"></asp:TextBox>
<asp:ImageButton ID="ibtnSelectOwner" runat="server" OnClientClick="return SelectOwner();"
ImageUrl="~/Themes/Images/btn_select.gif" />
因为这个用户控件在页面中总共使用了三次,所以查看源文件时会发现整个页面有三个SelectOwner()前台函数,系统不知道到底需要哪一个,所以默认为最后一个,所以在前两种统计方式中选择实体后会显示在最后一个统计方式中而不显示在对应的统计方式中。
解决方案:
1.在后台定义js函数,在满足条件的情况下给选择按钮增加单击事件的属性。
注意:在后台定义js函数时,若要给某个控件赋值,则需直接取解析出来的html的id值
代码如下:
private void DefineClick()
{
if (SelectType == "工程类型")
{
string sCript= @"<script type='text/javascript'>
function SelectProject() {
var argumentXML = GetArgumentsXML();
url = '../../Modules/General/Product/SelectProject.aspx';
var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
var xmlDom = showModalDialog(url, argumentXML, features);
if (null != xmlDom) {
var nodes = xmlDom.selectNodes('root/ProjectEntity');
var id = '';
var code = '';
var name = '';
var re = /\s/g;
var n = nodes.length - 1;
for (i = 0; i <= n; i++) {
var node = nodes(i);
id += node.attributes.getNamedItem('ProjectEntityID').value.replace(re, '') + ((i == n) ? '' : ';');
code += node.attributes.getNamedItem('ProjectEntityCode').value.replace(re, '') + ((i == n) ? '' : ';');
name += node.attributes.getNamedItem('ProjectEntityName').value.replace(re, '') + ((i == n) ? '' : ';');
}
document.getElementById('UCptTypeNotSign_tbProjectPhaseCode').value = code;
document.getElementById('<%=tbProjectPhaseName.ClientID %>').value = name;
return true;
}
return false;
}</script>";
Response.Write(sCript);
ibtnSelectProject.Attributes.Add("onclick", "return SelectProject()");
}
else if (SelectType == "业主")
{
}
}
这样写还是不行,相当于还是有三个相同名称的脚步函数所以调整了下,最终结果如下:
private void DefineClick()
{
string script = string.Empty;
string scriptHeader = "<script type='text/javascript'>";
string scriptPTFunName = " function SelectProject() ";
string scriptPTBody = @"{
var argumentXML = GetArgumentsXML();
url = '../../Modules/General/Product/SelectProject.aspx';
var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
var xmlDom = showModalDialog(url, argumentXML, features);
if (null != xmlDom) {
var nodes = xmlDom.selectNodes('root/ProjectEntity');
var id = '';
var code = '';
var name = '';
var re = /\s/g;
var n = nodes.length - 1;
for (i = 0; i <= n; i++) {
var node = nodes(i);
id += node.attributes.getNamedItem('ProjectEntityID').value.replace(re, '') + ((i == n) ? '' : ';');
code += node.attributes.getNamedItem('ProjectEntityCode').value.replace(re, '') + ((i == n) ? '' : ';');
name += node.attributes.getNamedItem('ProjectEntityName').value.replace(re, '') + ((i == n) ? '' : ';');
}";
string scriptPTFooter = string.Empty;
string scriptOwnerFunName = " function SelectOwner() ";
string scriptOwnerBody = @" {
var argumentXML = GetArgumentsXML();
var url = '../../Modules/General/Product/SelectCustomer.aspx';
var features = 'dialogHeight: 650px; dialogWidth: 950px; center: Yes; help: Yes; scroll:auto; status: no; resizable: yes';
var xmlDom = showModalDialog(url, argumentXML, features);
if (null != xmlDom) {
var nodes = xmlDom.selectNodes('root/Customer');
var id = '';
var name = '';
var n = nodes.length - 1;
var re = /\s/g;
for (i = 0; i <= n; i++) {
var node = nodes(i);
id += node.attributes.getNamedItem('CustomerEntityID').value.replace(re, '') + ((i == n) ? '' : ';');
name += node.attributes.getNamedItem('CustomerName').value.replace(re, '') + ((i == n) ? '' : ';');
}";
string scriptOwnerFooter = string.Empty;
string scriptFooter = "</script>";
if (SelectType == "工程类型")
{
scriptPTFunName = "function PTSelectProject()";
scriptOwnerFunName = "function PTSelectOwner()";
scriptPTFooter = @"
document.getElementById('UCptTypeNotSign_tbProjectPhaseCode').value = code;
document.getElementById('UCptTypeNotSign_tbProjectPhaseName').value = name;
return true;
}
return false;
}";
scriptOwnerFooter = @"
document.getElementById('UCptTypeNotSign_tbProprietor').value = name;
}
return false;
}";
script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;
Response.Write(script);
ibtnSelectProject.Attributes.Add("onclick", "return PTSelectProject()");
ibtnSelectOwner.Attributes.Add("onclick", "return PTSelectOwner()");
}
else if (SelectType == "业主")
{
scriptPTFunName = "function OWSelectProject()";
scriptOwnerFunName = "function OWSelectOwner()";
scriptPTFooter = @"
document.getElementById('UCOwnerNotSign_tbProjectPhaseCode').value = code;
document.getElementById('UCOwnerNotSign_tbProjectPhaseName').value = name;
return true;
}
return false;
}";
scriptOwnerFooter = @"
document.getElementById('UCOwnerNotSign_tbProprietor').value = name;
}
return false;
}";
script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;
Response.Write(script);
ibtnSelectProject.Attributes.Add("onclick", "return OWSelectProject()");
ibtnSelectOwner.Attributes.Add("onclick", "return OWSelectOwner()");
}
else if (SelectType == "合同类型")
{
scriptPTFunName = "function CTSelectProject()";
scriptOwnerFunName = "function CTSelectOwner()";
scriptPTFooter += @"
document.getElementById('UCctTypeNotSign_tbProjectPhaseCode').value = code;
document.getElementById('UCctTypeNotSign_tbProjectPhaseName').value = name;
return true;
}
return false;
}";
scriptOwnerFooter += @"
document.getElementById('UCctTypeNotSign_tbProprietor').value = name;
}
return false;
}";
script = scriptHeader + scriptPTFunName + scriptPTBody + scriptPTFooter + scriptOwnerFunName + scriptOwnerBody + scriptOwnerFooter + scriptFooter;
Response.Write(script);
ibtnSelectProject.Attributes.Add("onclick", "return CTSelectProject()");
ibtnSelectOwner.Attributes.Add("onclick", "return CTSelectOwner()");
}
}
显示成功,只是这个函数太长了,应该还可以进一步优化。