最近在写一个.net的信息发布系统,由于采用的是无限级目录,所以添加新闻时目录的呈现很是个问题,看过不少论坛都采用的是下面的呈现方式,决定也借鉴一哈子。
╋专题报道
│┣思政教育
│┣就业指导
│┣考研指南
╋文学艺术
│┣散文
││┣在水一方
││┣情感倾诉
在c#里用递归很容易显示出上面这种效果,但是我一直没找到很好的方法将栏目Bind到DropDownList控件里去,后来决定先构造一个DataTable,然后将处理过后的栏目逐条写进DataTable里。方法有点苯,但总算解决了问题。
代码:
DataTable dtNewsClass = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
DataColumn keyCol = new DataColumn("id", typeof(Int32));
dtNewsClass.Columns.Add(keyCol);
dtNewsClass.Columns.Add(new DataColumn("classname", typeof(string)));
SqlConnection sqlCnn = new SqlConnection(strCnn);
SqlCommand sqlCmd = new SqlCommand("sel_class", sqlCnn);
//相当于select * from T_Class where parentid = 0 order by id asc
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = sqlCmd;
sqlCmd.Parameters.Add("@id", SqlDbType.Int);
sqlCmd.Parameters["@id"].Value = 0;
sqlDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
DataSet NewsDataSet = new DataSet();
sqlDA.Fill(NewsDataSet,"T_Class");
DataTable ClassDT =NewsDataSet.Tables["T_Class"];
for (int i = 0; i < ClassDT.Rows.Count; i++)
{
DataRow newRow = dtNewsClass.NewRow();
newRow["id"] = ClassDT.Rows[i]["id"];
newRow["classname"] = "╋" + ClassDT.Rows[i]["classname"];
dtNewsClass.Rows.Add(newRow);
showclass((int)ClassDT.Rows[i]["id"], 1);
}
DDL_Class.DataSource = dtNewsClass;
DDL_Class.DataBind();
sqlCnn.Close();
}
public void showclass(int id, int n)
{
SqlConnection sqlCnn = new SqlConnection(strCnn);
SqlCommand sqlCmd = new SqlCommand("sel_class", sqlCnn);
//相当于select * from T_Class where parentid =@id order by id asc
sqlCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter sqlDA = new SqlDataAdapter();
sqlDA.SelectCommand = sqlCmd;
sqlCmd.Parameters.Add("@id", SqlDbType.Int);
sqlCmd.Parameters["@id"].Value = id;
sqlDA.MissingSchemaAction = MissingSchemaAction.AddWithKey;
DataSet newsDataSet = new DataSet();
sqlDA.Fill(newsDataSet, "T_Class");
DataTable newsDT = newsDataSet.Tables["T_Class"];
string sClass = "";
int num;
for (num = 1; num <= n; num++)
{
sClass = sClass + "│";
}
for (int i = 0; i < newsDT.Rows.Count; i++)
{
DataRow newRow = dtNewsClass.NewRow();
newRow["id"] = newsDT.Rows[i]["id"];
newRow["classname"] = sClass + "┣" + newsDT.Rows[i]["classname"];
dtNewsClass.Rows.Add(newRow);
showclass((int)newsDT.Rows[i]["id"], num);
}
sqlCnn.Close();
}