8,834
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Kingdee.Hk.Framework;
using System.Drawing.Design;
using System.Xml;
using System.Xml.XPath;
namespace Kingdee.Hk.Ui.Component.CBX
{
/// <summary>
/// 本组合框从数据库中查询数据,然后打包成项,填入组合框后供选择
/// </summary>
public partial class HkCbx_Sql : HkCbx_
{
public HkCbx_Sql()
{
InitializeComponent();
base.Items.Clear();
_Items = new HkDataItemCollection(this);
}
private string _KeyXmlElementName="";
private string _ValueXmlElementName="";
private string _Xml="";
private string _XPath="";
private string _SqlCommandText;
private string _FixedFilter="";
private string _Filter="";
private string _DataTableFilter="";
[Category ("业务-公共"), DisplayName ( "关键字元素名")]
public string KeyXmlElementName
{
get { return _KeyXmlElementName; }
set { _KeyXmlElementName = value; }
}
[Category("业务-公共"), DisplayName("值元素名")]
public string ValueXmlElementName
{
get { return _ValueXmlElementName; }
set { _ValueXmlElementName = value; }
}
[Category("业务-XML"), DisplayName("xml文档片断")]
public string Xml
{
get { return _Xml; }
set { _Xml = value; }
}
[Category("业务-XML"), DisplayName("过滤XPath表达式")]
public string XPath
{
get { return _XPath; }
set { _XPath = value; }
}
[Category("业务-数据库"), DisplayName("数据库命令")]
public string SqlCommandText
{
get { return _SqlCommandText; }
set { _SqlCommandText = value; }
}
[Category("业务-数据库"), DisplayName("固定的过滤器")]
public string FixedFilter
{
get { return _FixedFilter; }
set { _FixedFilter = value; }
}
[Category("业务-数据库"), DisplayName("变动过滤器")]
public string Filter
{
get { return _Filter; }
set { _Filter = value; }
}
[Category("业务-数据库"), DisplayName("结果集过滤器")]
public string DataTableFilter
{
get { return _DataTableFilter; }
set { _DataTableFilter = value; }
}
public string GetFullSqlCommandText()
{
StringBuilder sb = new StringBuilder(_SqlCommandText);
sb.Replace("@@Filter@@", Filter);
sb.Replace("@@FixedFilter@@", FixedFilter);
return sb.ToString();
}
public void RefreshFromDataSource ()
{
if (this.DesignMode == false)
{
this.Items.Clear();
IDbCommandAdapter adp = GlobalObject.DbCommandAdapter;
DataSet ds = adp.ExecuteSQL(this.GetFullSqlCommandText());
XmlDataDocument doc = new XmlDataDocument(ds);
DataRow[] rs = ds.Tables[0].Select(DataTableFilter);
foreach (DataRow r in rs)
{
XmlElement ele = doc.GetElementFromRow(r);
HkDataItem item = new HkDataItem ( this.KeyXmlElementName, this.ValueXmlElementName);
item.Xml = ele.OuterXml ;
this.Items.Add(item );
//base.Items.Add(item); //如果不加入这一行,在选择时就会出错,但加了之后,项目就重复了,因为本控件有了两个集合
ele = null;
}
doc = null;
rs = null;
ds.Dispose();
adp.Dispose();
}
}
public void RefreshFromXml()
{
if (this.DesignMode == false)
{
if (string.IsNullOrEmpty(this.XPath) == false || string.IsNullOrEmpty(this.Xml) == false)
{
this.Items.Clear();
XmlDocument doc = new XmlDocument();
doc.LoadXml(this.Xml);
XmlNodeList nodes = doc.SelectNodes(string.Format("descendant::{0}", this.XPath));
foreach (XmlNode node in nodes)
{
this.Items.Add(this.KeyXmlElementName, this.ValueXmlElementName, node.OuterXml);
}
}
}
}
protected override void OnCreateControl()
{
base.OnCreateControl();
if (string.IsNullOrEmpty(this.SqlCommandText) == false)
this.RefreshFromDataSource();
else
this.RefreshFromXml();
this.DropDownHeight = 200;
}
/// <summary>
/// 覆盖原有的变量,重写一个
/// </summary>
protected HkDataItemCollection _Items;
public new virtual HkDataItemCollection Items
{
get
{
return _Items;
}
}
public override int SelectedIndex
{
get
{
return base.SelectedIndex;
}
set
{
base.SelectedIndex = value;
}
}
public override
//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
[Editor(typeof(HkDataItemCollectionEditor), typeof(UITypeEditor))]
public class HkDataItemCollection:ObjectCollection
{
public HkDataItemCollection(HkCbx_Sql owner):base(owner )
{
}
public int Add(string keyName, string valueName, string xml)
{
HkDataItem item = new HkDataItem(keyName, valueName);
item.Xml = xml;
return this.Add(item);
}
public new HkDataItem this[int index]
{
get
{
return (HkDataItem)(base[index]);
}
set
{
base[index] = value;
}
}
private string _KeyXmlElementName;
public string KeyXmlElementName
{
get { return _KeyXmlElementName; }
set
{
foreach (HkDataItem item in this)
{
item.KeyXmlElementName = value;
}
_KeyXmlElementName = value;
}
}
private string _ValueXmlElementName;
public string ValueXmlElementName
{
get { return _ValueXmlElementName; }
set
{
foreach (HkDataItem item in this)
{
item.ValueXmlElementName = value;
}
_ValueXmlElementName = value;
}
}
}
}
}