View Full Version : سوال: دسته بندی مطالب
mahdidabaghi
پنج شنبه 04 مهر 1392, 22:02 عصر
سلام به دوستان
من میخوام برای دسته بندی مطالب Drop Down به شکل زیر داشته باشم :
111220
برای این منظور هم تیبل دیتابیس رو به صورت زیر ایجاد کردم :
111221
از دوستان عزیز میخوام بنده رو راهنمایی کنند چطوری میتونم Drop Down رو به صورتی که در عکس اول نشون دادم در بیارم
سپاس فراوان
mahdidabaghi
جمعه 05 مهر 1392, 00:43 صبح
اساتید یه کمکی برسونید:گریه:
بهنام صناعی
جمعه 05 مهر 1392, 09:46 صبح
سلام
برای این کار روش های مختلفی هست که من به عنوان مثال یکی از این روش ها رو برای شما شرح میدم که شامل استفاده از یک کنترل ObjectDataSource به عنوان منبع داده و پیاده سازی مدل و شی داده ای مربوطه هست.
ابتدا به یک مدل برای داده خودتون که همون "شاخه" هست احتیاج دارید که در واقع کلاسی به شکل زیر هست:
using System;
public class Category
{
public int Category_Id { get; set; }
public int Category_Parent { get; set; }
public string Category_Name { get; set; }
}
بعد به یک شی داده ای نیاز دارید که قرار هست داده ها رو به دست ObjectDataSource برسونه که این هم کلاسی هست به شکل زیر:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
public class CategoryManager
{
public List<Category> GetLinearList()
{
List<Category> rawList = new List<Category>();
List<Category> sortedList = new List<Category>();
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrin gs["DefaultConnectionString"].ConnectionString))
{
SqlCommand command = new SqlCommand("SELECT Category_Id, Category_Parent, Category_Name From Categories", connection);
command.CommandType = CommandType.Text;
connection.Open();
using (SqlDataReader dataReader = command.ExecuteReader())
{
if (dataReader.HasRows)
{
while (dataReader.Read())
{
Category category = new Category();
category.Category_Id = dataReader.GetInt32(0);
category.Category_Parent = dataReader.GetInt32(1);
category.Category_Name = dataReader.GetString(2);
rawList.Add(category);
}
}
dataReader.Close();
}
connection.Close();
}
loadTree(rawList, sortedList);
return sortedList;
}
void loadTree(List<Category> rawList, List<Category> sortedList, Category parent = null)
{
int parentId = parent == null ? -1 : parent.Category_Id;
List<Category> tempList = rawList.FindAll(x => x.Category_Parent == parentId);
foreach (Category item in tempList)
{
if (item.Category_Parent > 0)
item.Category_Name = string.Format("{0} > {1}", parent.Category_Name, item.Category_Name);
sortedList.Add(item);
loadTree(rawList, sortedList, item);
}
}
}
حالا کافیه اشیا ObjectDataSource و DropDownList رو از طریق ویزاردهای مربوطه به هم و به شی داده ای متصل کنید:
<asp:ObjectDataSource ID="odsCategories" runat="server" SelectMethod="GetLinearList" TypeName="CategoryManager"></asp:ObjectDataSource>
<asp:DropDownList ID="ddlCategories" runat="server" DataSourceID="odsCategories" DataTextField="Category_Name" DataValueField="Category_Id"></asp:DropDownList>
البته دقت کنید که این فقط یک مثال بود و کدها ممکنه بهینه یا خالی از خطا نباشند.
موفق باشید
mahdidabaghi
جمعه 05 مهر 1392, 09:49 صبح
ممنون دوست عزیز.
کد رو تست و نتیجه رو اعلام میکنم
:تشویق:
mahdidabaghi
جمعه 05 مهر 1392, 09:52 صبح
جسارتا اگه روش دیگه ای هم هست ممنون میشم اون رو هم بیان کنید.(صرفا جهت آشنایی با سایر روش ها)
سپاس فراوان
بهنام صناعی
جمعه 05 مهر 1392, 10:03 صبح
- پر کردن DropDownList در صفحه (اسپاگتی کد)
- استفاده از یوزر کنترل ها (کمی ساخت یافته تر از روش اول)
- استفاده از یک کنترل اختصاصی که مثل TreeView بتونه داده های درختی رو نشون بده (لیست کشویی درختی)
- ...
mahdidabaghi
جمعه 05 مهر 1392, 10:31 صبح
سلام مجدد
شرمنده . متاسفانه به ارور خوردم.امکان داره بفرمایین علت ارور چیه.
111230
mahdidabaghi
جمعه 05 مهر 1392, 11:04 صبح
:ناراحت: استادی هست مشکل این سمپل رو رفع کنه :عصبانی++:
mahdioo12194
جمعه 05 مهر 1392, 12:47 عصر
بفرما ! فقط میمونه اتصال به دیتابیس که البته شما دیتابیس رو قرار نداده بودید!!!
http://www.uploadbaz.com/bm4zqide5h6o
mahdidabaghi
شنبه 06 مهر 1392, 12:57 عصر
سلام مجدد
میخواستم بدونم چجوری میشه گرید رو هم به این صورت در بیارم؟
111286
یعنی چجوری میشه محل دسته بندی رو به صورتی که در عکس مشخص هست دربیارم؟
سپاسگزار میشم این مورد رو هم راهنمایی بفرمایید.
mahdidabaghi
شنبه 06 مهر 1392, 13:55 عصر
اساتید در این مورد نظری ندارند :افسرده:
kamranetemadi
شنبه 06 مهر 1392, 15:14 عصر
اتفاقا منم دنبال همچین موضوعی بودم که اینجارو پیدا کردم
یه استاد یه سرور یه مهربون لطف کنه بزرگواری کنه
یه کمکی برسونه
ممنون میشم :گیج::قلب:
بهنام صناعی
شنبه 06 مهر 1392, 16:52 عصر
کافیه فیلد سومی به اسم Category_Path به مدلتون اضافه کنید. به شکل زیر:
using System;
using System.ComponentModel;
public class Category
{
public int Category_Id { get; set; }
public int Category_Parent { get; set; }
public string Category_Name { get; set; }
public string Category_Path { get; set; }
}
و متد loadTree از شی داده ای رو به شکل زیر ویرایش کنید:
void loadTree(List<Category> rawList, List<Category> sortedList, int step = 0, Category parent = null)
{
int parentId = parent == null ? -1 : parent.Category_Id;
List<Category> tempList = rawList.FindAll(x => x.Category_Parent == parentId);
foreach (Category item in tempList)
{
if (parent != null)
{
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, item.Category_Name);
else if (step == 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Name, item.Category_Name);
else
item.Category_Path = parent.Category_Name;
}
sortedList.Add(item);
loadTree(rawList, sortedList, step + 1, item);
}
}
<asp:ObjectDataSource ID="odsCategories" runat="server" SelectMethod="GetLinearList" TypeName="CategoryManager"></asp:ObjectDataSource>
<asp:GridView ID="gvCategories" runat="server" AutoGenerateColumns="False" DataSourceID="odsCategories">
<Columns>
<asp:BoundField DataField="Category_Id" HeaderText="Category_Id" SortExpression="Category_Id" />
<asp:BoundField DataField="Category_Parent" HeaderText="Category_Parent" SortExpression="Category_Parent" />
<asp:BoundField DataField="Category_Name" HeaderText="Category_Name" SortExpression="Category_Name" />
<asp:BoundField DataField="Category_Path" HeaderText="Category_Path" SortExpression="Category_Path" />
</Columns>
</asp:GridView>
موفق باشید
mahdidabaghi
شنبه 06 مهر 1392, 22:39 عصر
کافیه فیلد سومی به اسم Category_Path به مدلتون اضافه کنید. به شکل زیر:
using System;
using System.ComponentModel;
public class Category
{
public int Category_Id { get; set; }
public int Category_Parent { get; set; }
public string Category_Name { get; set; }
public string Category_Path { get; set; }
}
و متد loadTree از شی داده ای رو به شکل زیر ویرایش کنید:
void loadTree(List<Category> rawList, List<Category> sortedList, int step = 0, Category parent = null)
{
int parentId = parent == null ? -1 : parent.Category_Id;
List<Category> tempList = rawList.FindAll(x => x.Category_Parent == parentId);
foreach (Category item in tempList)
{
if (parent != null)
{
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, item.Category_Name);
else if (step == 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Name, item.Category_Name);
else
item.Category_Path = parent.Category_Name;
}
sortedList.Add(item);
loadTree(rawList, sortedList, step + 1, item);
}
}
<asp:ObjectDataSource ID="odsCategories" runat="server" SelectMethod="GetLinearList" TypeName="CategoryManager"></asp:ObjectDataSource>
<asp:GridView ID="gvCategories" runat="server" AutoGenerateColumns="False" DataSourceID="odsCategories">
<Columns>
<asp:BoundField DataField="Category_Id" HeaderText="Category_Id" SortExpression="Category_Id" />
<asp:BoundField DataField="Category_Parent" HeaderText="Category_Parent" SortExpression="Category_Parent" />
<asp:BoundField DataField="Category_Name" HeaderText="Category_Name" SortExpression="Category_Name" />
<asp:BoundField DataField="Category_Path" HeaderText="Category_Path" SortExpression="Category_Path" />
</Columns>
</asp:GridView>
موفق باشید
یه دنیا ممنون ... با کد قشنگتون تونستم گرید رو به شکل زیر دربیارم :
111294
به عنوان سوال آخر(واقعا شرمنده) چجوری میشه رکورد اول رو از این گرید وردارم(یعنی رکورد با عنوان ریشه دیده نشه) و برای رکورد(به عنوان مثال) با ای دی 5 هم محل دسته بندی رو به این صورت داشته باشم : علمی-> تحقیقات که توی گرید اینجوریه علمی ->تحقیقات->سری (یعنی یجورایی عنوان دسته بندی (تو این مثال سری) رو توی محل دسته بندی نیاره )
مرسی که وقت میذارین و اگر سوالاتم یه خورده ابتدایه به یزرگی خودتون ببخشید (بنده در زمینه لینک تازه کارم)
سپاس از شما
بهنام صناعی
یک شنبه 07 مهر 1392, 12:30 عصر
دوست عزیز
با تغییرات کوچیک در متد loadTree به هر شکلی که لازم باشه می تونید فیلد های مورد نظر خودتون رو پر کنید. اگر اشتباه نکنم چیزی که مد نظر شماست با این تغییر قابل انجام هست:
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, parent.Category_Name);
else
item.Category_Path = parent.Category_Name;
متد loadTree در انتها به این شکل خواهد بود:
void loadTree(List<Category> rawList, List<Category> sortedList, int step = 0, Category parent = null)
{
int parentId = parent == null ? -1 : parent.Category_Id;
List<Category> tempList = rawList.FindAll(x => x.Category_Parent == parentId);
foreach (Category item in tempList)
{
if (parent != null)
{
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, parent.Category_Name);
else
item.Category_Path = parent.Category_Name;
}
sortedList.Add(item);
loadTree(rawList, sortedList, step + 1, item);
}
}
موفق باشید
mahdidabaghi
یک شنبه 07 مهر 1392, 13:03 عصر
دوست عزیز
با تغییرات کوچیک در متد loadTree به هر شکلی که لازم باشه می تونید فیلد های مورد نظر خودتون رو پر کنید. اگر اشتباه نکنم چیزی که مد نظر شماست با این تغییر قابل انجام هست:
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, parent.Category_Name);
else
item.Category_Path = parent.Category_Name;
متد loadTree در انتها به این شکل خواهد بود:
void loadTree(List<Category> rawList, List<Category> sortedList, int step = 0, Category parent = null)
{
int parentId = parent == null ? -1 : parent.Category_Id;
List<Category> tempList = rawList.FindAll(x => x.Category_Parent == parentId);
foreach (Category item in tempList)
{
if (parent != null)
{
if (step > 2)
item.Category_Path = string.Format("{0} > {1}", parent.Category_Path, parent.Category_Name);
else
item.Category_Path = parent.Category_Name;
}
sortedList.Add(item);
loadTree(rawList, sortedList, step + 1, item);
}
}
موفق باشید
ممنونم ... جسارتا اون رکورد اول (id = 0) رو چجوری میشه از گرید حدف کنم؟
(پر رویی بنده رو به بزرگیتون ببخشید)
بهنام صناعی
یک شنبه 07 مهر 1392, 14:28 عصر
این قسمت رو میذارم به عهده ی خودتون، کار ساده ای هست :لبخندساده:
mahdidabaghi
یک شنبه 07 مهر 1392, 21:25 عصر
ممنونم مهندس ... :تشویق:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.