问题的提出:在某个软件中,系统主功能通过Treeview来实现各子功能的导航,现要为Treeview动态添加每个功能模块的节点图标,而图标是以二进制的形式存储在数据库中的image字段里面,要通过在主界面初始加载的时候就显示对应节点的图片。为此下面给出一种解决方案。
一.读取图片
首先我们应该将图片从数据库里面读取出来,将读取出来的图片添加在imagelist对象中,因为treeview中的节点图片必须来源于imagelist对象中的值。主要代码如下:
public System.Drawing.Bitmap GetSystemFunctionModulImage(string modulName)
{
byte[] buffer = null;
System.Data.SqlClient.SqlParameter[] param ={ new System.Data.SqlClient.SqlParameter("@modulName", System.Data.SqlDbType.VarChar)};
param[0].Value = modulName;
SqlDataReader dr = DBUtility.SqlServerHelper.ExecuteReader(CommandType.Text, SQL_SELECT_GETSYSTEMFUNCTIONMODULIMAGE/*SQL语句,根据自己实际情况而定*/, param);//这是我的自定义方法
if (dr.Read() && dr[0].ToString() !="")
{
buffer = (byte[])dr.GetValue(0);
dr.Close();
}
System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer);
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(ms);
return bmp;
}
主要代码见红色部分,这是读取图片的方法,dr里面保存的就是二进制图片文件,通过以上方法转换为位图文件格式。
二.将读取的图片填充到imagelist中,主要代码如下:
private void LoadSystemFunctionModulInfo()
{
ImageList img = new ImageList();
SystemFunctionModulLogic systemFunctionModulLogic = new SystemFunctionModulLogic();
ds = systemFunctionModulLogic.GetSystemFunctionModulInfo(User.UserNo);
DataRow[] DR = ds.Tables[0].Select("FatherModulNo=0");
//Test--------------------------载入模块图片
System.Data.SqlClient.SqlDataReader reader = systemFunctionModulLogic.GetUserSystemFunctionModulInfo(User.UserNo);//这个自定义方法是根据当前用户的权限所属的功能模块信息,在reader中保存的是模块名称,根据自己的实际情况而定,大家无需在意
while (reader.Read())
{
Bitmap bmp = systemFunctionModulLogic.GetSystemFunctionModulImage(reader[1].ToString().Trim());
img.Images.Add(bmp);
}
reader.Close();
//}
//---------------------------------
img.ImageSize = new Size(32, 32);
treeViewFunctionModuleinfo.ImageList = img;
treeViewFunctionModuleinfo.ImageIndex = 0;//初始索引号为0,主要代码
/*为treeview的每个节点添加图片,根据自己的实际情况而定
foreach (DataRow dr in DR)
{
TreeNode tn = new TreeNode();
tn.Text = dr[1].ToString().Trim();
tn.Tag = dr[0].ToString();
treeViewFunctionModuleinfo.Nodes.Add(tn);
tn.ImageIndex = treeViewFunctionModuleinfo.ImageIndex;
tn.SelectedImageIndex = treeViewFunctionModuleinfo.ImageIndex;
treeViewFunctionModuleinfo.ImageIndex += 1;//索引号的改变,主要代码,这点大家给点建议吧,这是在listimage对象中图片是按照模块对应的顺序存放的,如果不是按顺序存放的,应该怎样解决呢?
LoadSonSystemFunctionModulInfo(tn, tn.Tag.ToString());
}
*/
}
注:此方法就是动态为treeview添加图片的简单方法,具体还要根据你的实际情况而定,基本思路就是这样,当然还有更好的方法,希望大家贴出来分享一下。