barzin144
یک شنبه 11 آبان 1393, 00:16 صبح
سلام دوستان ، شاید زیاد براتون پیش آمده باشه که در سیستم نظرات ساییتون بخواهید طوری باشه که هر کسی بتونه برای هر نظری پاسخی بنویسه من این سیستم رو با تابع بازگشتی پیاده کردم که حتی میتوان به پاسخ های زیر نظرات هم پاسخ داد.
ابتدا جدول دیتا بیس رو به این صورت ساختم:
فیلد ID که به IDENTITY هست و کلید جدول
فیلد Name که نام کسی که نظر یا پاسخ میدهد
فیلد Comment که متن نظر یا پاسخ هست
فیلد AnswerTo که میتواند NULL باشد یا ID نظری که پاسخ اون هست درج میشه
حالا کد تابع بازگشتی که برای ارتباط با دیتابیس از ADO.net 2 استفاده کردم که در انتها کوئری های هر کدام رو میزارم.
private string BindComments(int CommentAnswer, string strAllCM)
{
DataSet.CommentsDataTable oCommentsDataTable =
new DataSet.CommentsDataTable();
DataSetTableAdapters.CommentsTableAdapter oCommentsTableAdapter =
new DataSetTableAdapters.CommentsTableAdapter();
if (CommentAnswer == 0)
{
oCommentsTableAdapter.FillCommentByNoAnswerTo(oCom mentsDataTable);
}
else
{
oCommentsTableAdapter.FillCommentsByAnswerTo(oComm entsDataTable, CommentAnswer);
}
if (oCommentsDataTable.Count != 0)
{
for (int i = 0; i < oCommentsDataTable.Count; i++)
{
strAllCM +=
string.Format("<div class='Container'><div class='divComment'><div class='CM'><div class='ImgName'><img src='/admin.png' alt='pic'/><a class='Name'>{0}:</a><a class='Answer'>پاسخ</a></div><a class='Comment'>{1}</a></div>"
, oCommentsDataTable[i].Name, oCommentsDataTable[i].Comment);
strAllCM = BindComments(oCommentsDataTable[i].ID, strAllCM);
}
strAllCM += "</div></div>";
}
else
{
strAllCM += "</div></div>";
}
return strAllCM;
}
ورودی های تابع: commentanswer که id نظری که پاسخ های اون باید واکشی شود میزاریم در ابتدای کار 0 میگزاریم یعنی همیشه ما مقدار 0 میدهیم و در فراخوانی های بعدی تایع خودش عدد مورد نیازش رو قرار میده.
strALLCM که ما یه استرینگ خالی پاس میدیم و تابع هر بار html نظرات رو توش میگذاره و در فراخوانی بعدی استفاده میکنه.
خروجی هم که یک استریگ هست که حاوی html نظرات و پاسخ ها هست.
پس برای استفاده از تابع
litComments.Text = BindComments(0, "");
حالا کوئری های استفاده شده:
تمام نظراتی که پاسخ به هیچ نظری نیستن را واکشی میکنه در واقع فقط نظرات رو میاره
FillCommentByNoAnswerTo
SELECT ID, Name, Comment, AnswerTo
FROM Comments
WHERE (AnswerTo IS NULL)
ORDER BY ID DESC
تمام پاسخ هایی که به id یک نظر خاص داده شده است
FillCommentsByAnswerTo
SELECT ID, Name, Comment, AnswerTo
FROM Comments
WHERE (AnswerTo = @AnswerTo)
ORDER BY ID DESC
در ضمن من فیلد تاریخ را نگذاشته بودم که باید باشه فقط برای سادگی حذفش کردم و ترتیب ورود نظرات رو از id اونها میفهمم.
حالا میتونید با اضافه کردن Ajax یک نمونه مثل این نمونه (http://barzin.somee.com/Comments) ایجاد کنید.
موفق باشید.
ابتدا جدول دیتا بیس رو به این صورت ساختم:
فیلد ID که به IDENTITY هست و کلید جدول
فیلد Name که نام کسی که نظر یا پاسخ میدهد
فیلد Comment که متن نظر یا پاسخ هست
فیلد AnswerTo که میتواند NULL باشد یا ID نظری که پاسخ اون هست درج میشه
حالا کد تابع بازگشتی که برای ارتباط با دیتابیس از ADO.net 2 استفاده کردم که در انتها کوئری های هر کدام رو میزارم.
private string BindComments(int CommentAnswer, string strAllCM)
{
DataSet.CommentsDataTable oCommentsDataTable =
new DataSet.CommentsDataTable();
DataSetTableAdapters.CommentsTableAdapter oCommentsTableAdapter =
new DataSetTableAdapters.CommentsTableAdapter();
if (CommentAnswer == 0)
{
oCommentsTableAdapter.FillCommentByNoAnswerTo(oCom mentsDataTable);
}
else
{
oCommentsTableAdapter.FillCommentsByAnswerTo(oComm entsDataTable, CommentAnswer);
}
if (oCommentsDataTable.Count != 0)
{
for (int i = 0; i < oCommentsDataTable.Count; i++)
{
strAllCM +=
string.Format("<div class='Container'><div class='divComment'><div class='CM'><div class='ImgName'><img src='/admin.png' alt='pic'/><a class='Name'>{0}:</a><a class='Answer'>پاسخ</a></div><a class='Comment'>{1}</a></div>"
, oCommentsDataTable[i].Name, oCommentsDataTable[i].Comment);
strAllCM = BindComments(oCommentsDataTable[i].ID, strAllCM);
}
strAllCM += "</div></div>";
}
else
{
strAllCM += "</div></div>";
}
return strAllCM;
}
ورودی های تابع: commentanswer که id نظری که پاسخ های اون باید واکشی شود میزاریم در ابتدای کار 0 میگزاریم یعنی همیشه ما مقدار 0 میدهیم و در فراخوانی های بعدی تایع خودش عدد مورد نیازش رو قرار میده.
strALLCM که ما یه استرینگ خالی پاس میدیم و تابع هر بار html نظرات رو توش میگذاره و در فراخوانی بعدی استفاده میکنه.
خروجی هم که یک استریگ هست که حاوی html نظرات و پاسخ ها هست.
پس برای استفاده از تابع
litComments.Text = BindComments(0, "");
حالا کوئری های استفاده شده:
تمام نظراتی که پاسخ به هیچ نظری نیستن را واکشی میکنه در واقع فقط نظرات رو میاره
FillCommentByNoAnswerTo
SELECT ID, Name, Comment, AnswerTo
FROM Comments
WHERE (AnswerTo IS NULL)
ORDER BY ID DESC
تمام پاسخ هایی که به id یک نظر خاص داده شده است
FillCommentsByAnswerTo
SELECT ID, Name, Comment, AnswerTo
FROM Comments
WHERE (AnswerTo = @AnswerTo)
ORDER BY ID DESC
در ضمن من فیلد تاریخ را نگذاشته بودم که باید باشه فقط برای سادگی حذفش کردم و ترتیب ورود نظرات رو از id اونها میفهمم.
حالا میتونید با اضافه کردن Ajax یک نمونه مثل این نمونه (http://barzin.somee.com/Comments) ایجاد کنید.
موفق باشید.