小弟刚学习用ComponentArt Web.UI 这个控件。最近用到其中的TreeViwe(带CheckBox),发现了一个令我郁闷了好几天,又不知道怎么解决的问题,希望用过ComponentArt Web.UI的高手帮忙解答。 新建一个aspx页面 加入如下代码。
<script language="javascript">
function nodeCheckChanged(node)
{
var status = "Unchecked";
if (node.Checked) status = "Checked";
document.getElementById("lblClientSideCheck").innerHTML = status + ": '" + node.ID + "'";
}
</script> <form id="Form1" method="post" runat="server">
<table>
<tr>
<td align="center">
<COMPONENTART:TREEVIEW id="tvRoles" runat="server" ClientSideOnNodeCheckChanged="nodeCheckChanged" EnableViewState="true"
ImagesBaseUrl="images/" LineImagesFolderUrl="images/lines/" ShowLines="true" NodeLabelPadding="3" ItemSpacing="0" DefaultImageHeight="16"
DefaultImageWidth="16" LineImageHeight="20" LineImageWidth="19" NodeEditCssClass="NodeEdit" HoverNodeCssClass="HoverTreeNode"
SelectedNodeCssClass="SelectedTreeNode" NodeCssClass="TreeNode" CssClass="TreeView" KeyboardEnabled="true" NodeEditingEnabled="false"
DragAndDropEnabled="false" Width="220" Height="320"> </COMPONENTART:TREEVIEW> </td>
<td> <asp:button id="btOK" Runat="server" Text="确定"> </asp:button>
<td> <asp:label id="lblClientSideCheck1" runat="server" CssClass="hint"> </asp:label> </td>
</tr>
</table>
</form>
页面中加入一个Button的原因只是为了点击Button时回发服务器。
cs代码
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
buildTree();
}
} private void buildTree()
{
DataSet dataSet=new DataSet();
dataSet=//(...这里假设dataSet已被具有父子关系的数据所赋值 注:最大的根节点的父节点的ID应为null 否则下面的dataSet.Relations会报错)
dataSet.Relations.Add("NodeRelation",dataSet.Tables[0].Columns["RolesID"],dataSet.Tables[0].Columns["RolesParentID"]);
foreach(DataRow dbRow in dataSet.Tables[0].Rows)
{
if(dbRow.IsNull("RolesParentID"))
{
ComponentArt.Web.UI.TreeViewNode newNode= CreateNode(dbRow["RolesName"].ToString(),dbRow["RolesID"].ToString(),dbRow["ImagerUrl"].ToString(),true);
this.tvRoles.Nodes.Add(newNode);
PopulateSubTree(dbRow,newNode);
}
}
}
private void PopulateSubTree(DataRow dbRow, ComponentArt.Web.UI.TreeViewNode node)
{
foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
{
ComponentArt.Web.UI.TreeViewNode childNode = CreateNode(childRow["RolesName"].ToString(),dbRow["RolesID"].ToString(),dbRow["ImagerUrl"].ToString(),true);
node.Nodes.Add(childNode);
PopulateSubTree(childRow, childNode);
}
} private ComponentArt.Web.UI.TreeViewNode CreateNode(string RolesName,string RolesID,string imageurl,bool expanded)
{
ComponentArt.Web.UI.TreeViewNode node = new ComponentArt.Web.UI.TreeViewNode();
node.Text = RolesName;
node.ID=RolesID;
node.ShowCheckBox=true;
node.ImageUrl = imageurl;
node.Expanded = expanded;
return node;
}
运行程序,当点击CheckBox时 使CheckBox处于被选中的状态。然后再点击Button 回发到服务器后,你会发现以前没有被选中的CheckBox中的个别竟然变成了已选中的状态。 经过这几天的研究发现当注释掉private ComponentArt.Web.UI.TreeViewNode CreateNode(string RolesName,string RolesID,string imageurl,bool expanded)这个函数中的node.ID=RolesID的时候,上述情况就不再发生,但是当加入node.ID=RolesID的时候却又出现上面的情况。 这个问题郁闷了几天,我想大家用TreeView就是为了用他的node.ID;但是在ComponentArt Web.UI 中的TreeView却出现这样的情况。郁闷。
不知道大家可否有解决办法或者有好用一点的TreeView控件。
要是有的话麻烦发到 谢谢了!!!
<script language="javascript">
function nodeCheckChanged(node)
{
var status = "Unchecked";
if (node.Checked) status = "Checked";
document.getElementById("lblClientSideCheck").innerHTML = status + ": '" + node.ID + "'";
}
</script> <form id="Form1" method="post" runat="server">
<table>
<tr>
<td align="center">
<COMPONENTART:TREEVIEW id="tvRoles" runat="server" ClientSideOnNodeCheckChanged="nodeCheckChanged" EnableViewState="true"
ImagesBaseUrl="images/" LineImagesFolderUrl="images/lines/" ShowLines="true" NodeLabelPadding="3" ItemSpacing="0" DefaultImageHeight="16"
DefaultImageWidth="16" LineImageHeight="20" LineImageWidth="19" NodeEditCssClass="NodeEdit" HoverNodeCssClass="HoverTreeNode"
SelectedNodeCssClass="SelectedTreeNode" NodeCssClass="TreeNode" CssClass="TreeView" KeyboardEnabled="true" NodeEditingEnabled="false"
DragAndDropEnabled="false" Width="220" Height="320"> </COMPONENTART:TREEVIEW> </td>
<td> <asp:button id="btOK" Runat="server" Text="确定"> </asp:button>
<td> <asp:label id="lblClientSideCheck1" runat="server" CssClass="hint"> </asp:label> </td>
</tr>
</table>
</form>
页面中加入一个Button的原因只是为了点击Button时回发服务器。
cs代码
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
buildTree();
}
} private void buildTree()
{
DataSet dataSet=new DataSet();
dataSet=//(...这里假设dataSet已被具有父子关系的数据所赋值 注:最大的根节点的父节点的ID应为null 否则下面的dataSet.Relations会报错)
dataSet.Relations.Add("NodeRelation",dataSet.Tables[0].Columns["RolesID"],dataSet.Tables[0].Columns["RolesParentID"]);
foreach(DataRow dbRow in dataSet.Tables[0].Rows)
{
if(dbRow.IsNull("RolesParentID"))
{
ComponentArt.Web.UI.TreeViewNode newNode= CreateNode(dbRow["RolesName"].ToString(),dbRow["RolesID"].ToString(),dbRow["ImagerUrl"].ToString(),true);
this.tvRoles.Nodes.Add(newNode);
PopulateSubTree(dbRow,newNode);
}
}
}
private void PopulateSubTree(DataRow dbRow, ComponentArt.Web.UI.TreeViewNode node)
{
foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation"))
{
ComponentArt.Web.UI.TreeViewNode childNode = CreateNode(childRow["RolesName"].ToString(),dbRow["RolesID"].ToString(),dbRow["ImagerUrl"].ToString(),true);
node.Nodes.Add(childNode);
PopulateSubTree(childRow, childNode);
}
} private ComponentArt.Web.UI.TreeViewNode CreateNode(string RolesName,string RolesID,string imageurl,bool expanded)
{
ComponentArt.Web.UI.TreeViewNode node = new ComponentArt.Web.UI.TreeViewNode();
node.Text = RolesName;
node.ID=RolesID;
node.ShowCheckBox=true;
node.ImageUrl = imageurl;
node.Expanded = expanded;
return node;
}
运行程序,当点击CheckBox时 使CheckBox处于被选中的状态。然后再点击Button 回发到服务器后,你会发现以前没有被选中的CheckBox中的个别竟然变成了已选中的状态。 经过这几天的研究发现当注释掉private ComponentArt.Web.UI.TreeViewNode CreateNode(string RolesName,string RolesID,string imageurl,bool expanded)这个函数中的node.ID=RolesID的时候,上述情况就不再发生,但是当加入node.ID=RolesID的时候却又出现上面的情况。 这个问题郁闷了几天,我想大家用TreeView就是为了用他的node.ID;但是在ComponentArt Web.UI 中的TreeView却出现这样的情况。郁闷。
不知道大家可否有解决办法或者有好用一点的TreeView控件。
要是有的话麻烦发到 谢谢了!!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货