PDA

View Full Version : به دست آوردن Parent ها بر اساس ID آخرین فرزند به صورت بازگشتی



bftarane
شنبه 30 فروردین 1393, 20:45 عصر
سلام.
من یه جدول دارم که نوع های زمین به صورت سلسله مراتبی در اون ذخیره میشن
به شکل زیر
118165

و یه جدول دیگه دارم که ویژگیهای ملک از قبیل کشور و همچنین آی دی نوع زمین در اون ذخیره میشه، به شکل زیر

118166
یعنی فرضاً اگه نوع ملک
مستغلات ، زمین، کشاورزی باشه
و آی دی اینا به ترتیب 1و19و48
باشه من می یام 48 رو در جدولم ذخیره میکنم

حالا من اطلاعات رو از جدول ملک واکشی می کنم و در ریپیتر نشون می دم
حالا من می خوام با داشتن آی دی نوع ملک
نوع ملک رو به صورت سلسله مراتبی در ریپیتر نشون بدم

بنابراین کدهای زیر رو نوشتم
ولی مشکلی که داره اینه که فرضاً برای سطر اول نشون میده
مستغلات، زمین، کشاورزی
برای سطر دوم
میاد مقدار قبلی رو هم نشون میده
یعنی مثلاً نشون میده
مستغلات،زمین، مستغلات، زمین، کشاورزی
در حالی که فقط باید نشون بده مستغلات، زمین

لطفاً راهنمایی کنید خیلی کارم گیره.


public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GetProperty();
}
}

int parentID = 0;
string Title = "";
List<string> Level = new List<string>();
string PropertyType = "";
public string GetLevelsByLastLevelID(int PropertyTypeID)
{
string ConnString = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;

string SqlString = "select ParentID,Title from tbl_PropertyType where PropertyTypeID=@PropertyTypeID";

using (OleDbConnection conn = new OleDbConnection(ConnString))
{

using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
{

cmd.CommandType = CommandType.Text;

cmd.Parameters.AddWithValue("@PropertyTypeID", PropertyTypeID);

conn.Open();
using (OleDbDataReader reader = cmd.ExecuteReader())
{

if (reader.Read())
{
parentID = Convert.ToInt32(reader["ParentID"]);
Title = Convert.ToString(reader["Title"]);
PropertyTypeID = parentID;
Level.Add(Title);
}

}

}

}


if (parentID != 0)
{
GetLevelsByLastLevelID(PropertyTypeID);
}

PropertyType= string.Join(",",Level);

return PropertyType;
}


و در ریپیتر هم به این شکل استفاده می کنم متد بالا رو:

<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%#GetLevelsByLastLevelID((int)Eval("PropertyTypeID")) %>'></asp:Label>
<hr />
</ItemTemplate>
</asp:Repeater>
فایل کامل رو هم ضمیمه کردم: فقط دیتابیسش اکسس هست.

یعنی امروز به مشکل پشت مشکل خوردم وقت هم خیلی کم دارم. یعنی الآن از آقای همساده هم داغون ترم.

parvizwpf
یک شنبه 31 فروردین 1393, 02:38 صبح
احتمالا مشکل شما تعریف آبجکت level بصورا عمومی در این کلاس هست که هی میاد فقط استرینگ درونش اضافه میکنه و برای مقدار جدید پاک نمیشه. مقادیر رو با هم داره ادغام میکنه.

bftarane
یک شنبه 31 فروردین 1393, 09:03 صبح
آخه وقتی می یام داخل متد هم می زارمش به شکل زیر

public string GetLevelsByLastLevelID(int PropertyTypeID)
{
List<string> Level = new List<string>();
فقط سطوح اول رو می ده.
اگه نتونم از این روش استفاده کنم مجبور می شم هر سه سطح رو در جدول موقع ثبت، درج کنم که فکر کنم روش خوبی نباشه.
حتی این رو هم امتحان کردم و static ها رو برداشتم ولی نتیجه فرقی نکرد

if (!IsPostBack)
{
Level.Clear();
GetProperty();

}
من خودم به این تیکه شک دارم

if (parentID != 0)
{
GetLevelsByLastLevelID(PropertyTypeID);
}

PropertyType= string.Join(",",Level);

return PropertyType;
چون breack Point که می زارم و Trarce می کنم فکر کنید می یاد PropertyType رو return می کنه، بعد که F10 میزنم می پره داخل

if (parentID != 0)
{
یعنی برگشت به عقب داره که خیلی برام عجیبه و عجیب تر اینکه وقتی این پرش اتفاق می افته که حتی شرط هم برقرار نیست یعنی ParentID مساوی با صفره