封装组合框时,如何将Items属性封装为强类型(自定义的类型)?

DalyQiao 2010-07-05 12:28:46
在封装组合框时,遇到个麻烦,就是对Items属性没办法封装,没办法让他变成我的自定义集合类型。

有那位大侠能救我于水火之中?
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;
}
}


}
}
}


...全文
80 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuzhan87 2010-07-25
  • 打赏
  • 举报
回复
自定义一个继承自item的类 将这个类加入组合框自定义类中
-小蕾- 2010-07-15
  • 打赏
  • 举报
回复
帮顶,坐等高手。。

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧