En çok başımızı ağrıtan uygulamalardan birisi de sınırsız menü yapım işlemleridir.Dannyz arkadaşıma lazım olan bu menünün C# ile kodlanmış olan halini burda paylaşmak istiyorum.
Oracle veritabanı :
CREATE TABLE SINIRSIZ_MENU ( ID INTEGER,--menü id ADI VARCHAR2(20 BYTE) NOT NULL, -- menü adı UST_ID INTEGER, -- menü üst id, eğer üst id yoksa değeri null olmalıdır URL VARCHAR(255) -- adres )
C# kodları :
public string Sinirsizmenu(string pPrnt)
{
var dbs = new VeritabaniBaglantiYap("thegkmnkc", "localhost", "****");
var dt = dbs.SorguSonucu("select coalesce(M.UST_ID,0) ust_id,id,adi from sinirsiz_menu m order by m.id asc"); // DataTable
var diziler = new Hashtable();
var indArr = new int[dt.Rows.Count];
for (var i = 0; i < dt.Rows.Count; i++)
{
var tmp = new Hashtable();
tmp["baslik"] = dt.Rows[i]["ADI"].ToString();
tmp["parent"] = dt.Rows[i]["UST_ID"].ToString();
tmp["url"] = dt.Rows[i]["URL"].ToString();
diziler[dt.Rows[i]["ID"].ToString()] = tmp;
indArr[i] = Convert.ToInt32(dt.Rows[i]["ID"].ToString());
}
var hasChilds = false;
var mnuStr = "";
for (var i = 0; i < diziler.Count; i++)
{
var enm = (Hashtable)diziler[indArr[i].ToString()];
var enim = enm.GetEnumerator(); //IDictionaryEnumerator
enim.MoveNext();
var anahtar = indArr[i].ToString();
var baslik = enim.Value;
enim.MoveNext();
var prnt = enim.Value.ToString();
enim.MoveNext();
var url = enim.Value.ToString();
if (pPrnt != prnt) continue;
if (!hasChilds)
{
hasChilds = true;
mnuStr += "<ul>";
}
mnuStr += "<li><a href="\">" + baslik + "</a>";
mnuStr += Sinirsizmenu(anahtar);
mnuStr += "<li>";
}
if (hasChilds)
mnuStr += "</ul>";
return mnuStr;
}
bu ilk hali, daha sonra optimizasyon yapıp yayınlayacağım yine burada, ancak istenilen yapıyı oluşturuyor şimdilik.
