DataBinding Problem، نحوه ی بایند کردن DataList به DataTable
سلام و خسته نباشید
یک DataList خیلی ساده روی Page ام کشیدم با دو Lable به صورت زیر :
<asp:DataList ID="DataList1" runat="server" EnableViewState="false" DataKeyField="id">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval("title") %>'></asp:Label>
<hr />
<asp:Label ID="Label2" runat="server" Text='<%# Eval("body") %>'></asp:Label>
</ItemTemplate>
</asp:DataList>
حالا در CodeBehind صفحه هم این کد رو نوشتم :
public partial class _Default : System.Web.UI.Page
{
int i = 0;
DataTable dt = new DataTable();
string title = string.Empty;
DataColumn dc1 = new DataColumn("id");
DataColumn dc2 = new DataColumn("title");
DataColumn dc3 = new DataColumn("body");
protected void Page_Load(object sender, EventArgs e)
{
this.dt.Columns.Add(dc1);
this.dt.Columns.Add(dc2);
this.dt.Columns.Add(dc3);
this.DataList1.DataSource = this.dt;
this.DataList1.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
this.title = "Title - " + this.i.ToString();
string body = this.FCKeditor1.Value;
this.dt.Rows.Add(new object[] { this.i, this.title, body });
}
}
اما پس از فشار دادن دکمه، هیچ اتفاقی نمیفته، مشکل کجاست ؟
نقل قول: DataBinding Problem، نحوه ی بایند کردن DataList به DataTable
نقل قول: DataBinding Problem، نحوه ی بایند کردن DataList به DataTable
این مشکل اکثر افرادی هست که به تازگی از Win Apps به Web Apps مهاجرت کردن و مفاهیم ویندوز رو با وب اشتباه می گیرند.
پس از اینکه صفحه ای به کلاینت پاس داده شد، تمامی منابع خاص اون صفحه هم از بین میرن.
متغیر عمومی در صفحات وب معنا نداره. برای اینکه موجودیتی رو در تمامی صفحات داشته باشی از مکانیزم های مختلفی که ارائه شده مثل Session، Cache، Application و ... باید استفاده کنی.
کدی که نوشتی بر طبق ماهیت وب، هر بار تمامی اشیا رو مجددا ایجاد می کنه و در نتیجه، DataTable همیشه خالی هست.
کد اصلاح شده رو به شکل ذیل واست نوشتم. البته کمی با عجله نوشتم. میتونی قشنگتر هم بنویسیش:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["dt"] != null)
{
DataTable dt = (DataTable)Session["dt"];
DataList1.DataSource = dt;
DataList1.DataBind();
}
}
}
protected void Button_Click(object sender, EventArgs e)
{
int i = 0;
string title = string.Empty;
title = "Title - " + i.ToString();
string body = FCKeditor1.Value;;
if (Session["dt"] == null)
{
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn("id");
DataColumn dc2 = new DataColumn("title");
DataColumn dc3 = new DataColumn("body");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Rows.Add(new object[] { i, title, body });
Session["dt"] = dt;
DataList1.DataSource = dt;
DataList1.DataBind();
}
else
{
DataTable dtTemp = (DataTable) Session["dt"];
dtTemp.Rows.Add(new object[] { i, title, body });
Session["dt"] = dtTemp;
DataList1.DataSource = dtTemp;
DataList1.DataBind();
}
}
}
موفق باشید.