با سلام
جدول دیتابیس من به این صورت هست:
من یک دیتالیست قرار دادم به این صورت:
<asp:DataList OnItemCommand="DataList1_ItemCommand" ID="DataList1" runat="server"> <ItemTemplate> <ul> <li> <p><%# Eval("Title") %></p> <asp:LinkButton ID="LinkButton1" CommandName="Edit" CommandArgument='<%#Eval("ID") %>' CssClass="Button1" runat="server">ویرایش</asp:LinkButton> <span><%#Eval("DateReg") %></span> </li> </ul> </ItemTemplate> </asp:DataList>
و کدنویسی هم به این صورت:
public void Databind1() { DAL run = new DAL(); DataTable dt = new DataTable(); string sqlText = "select top 5 * from Tbl_Content where subjectid=4 order by id desc"; dt = run.ExecuteQuery(sqlText); DataList1.DataSource = dt; DataList1.DataBind(); } protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e) { if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id=2"); } }
حالا وقتی روی button ویرایش هر سطر از دیتالیست کلیک میکنم به درستی ریدایرکت میشه به صفحه panel.aspx?id=2
توی صفحه panel.aspx?id=2 هم فیلد هایی رو قرار دادم که محتوای سطر انتخابی از دیتابیس رو بریزم توی این فیلد ها و ادیتور ها که در نهایت پست ویرایش بشه
کدنویسی صفحه panel.aspx?id=2 هم به این صورت هست:
protected void Page_Load(object sender, EventArgs e) { TextBox2.Text = Persia.Calendar.ConvertToPersian(DateTime.Now).Persian; DAL run = new DAL(); DataTable dt = new DataTable(); string sqltext = string.Format("select * from tbl_content where id={0}", Request.QueryString["ID"]); dt = run.ExecuteQuery(sqltext); ID.Value = dt.Rows[0]["ID"].ToString(); Title.Text = dt.Rows[0]["Title"].ToString(); SmallText.Text = dt.Rows[0]["SmallText"].ToString(); LongText.Text = dt.Rows[0]["LongText"].ToString(); Subject.Value = dt.Rows[0]["SubjectID"].ToString(); Picture.Text = dt.Rows[0]["SmallPicture"].ToString(); }
اما حالا وقتی ریدایرکت میشه به صفحه panel.aspx?id=2 این ارور رو میده:
لازم به ذکر هست اگر کدنویسی صفحه panel.aspx?id=2 رو به این صورت قرار بدم ارور نمیده و محتوا رو میریزه توی فیلد ها اما محتوای سطر انتخابی رو نمیریزه و اولین سطر جدول دیتابیس رو میریزه:
protected void Page_Load(object sender, EventArgs e) { TextBox2.Text = Persia.Calendar.ConvertToPersian(DateTime.Now).Persian; DAL run = new DAL(); DataTable dt = new DataTable(); string sqltext = string.Format("select * from tbl_content"); dt = run.ExecuteQuery(sqltext); ID.Value = dt.Rows[0]["ID"].ToString(); Title.Text = dt.Rows[0]["Title"].ToString(); SmallText.Text = dt.Rows[0]["SmallText"].ToString(); LongText.Text = dt.Rows[0]["LongText"].ToString(); Subject.Value = dt.Rows[0]["SubjectID"].ToString(); Picture.Text = dt.Rows[0]["SmallPicture"].ToString(); }
ممنون میشم راهنمایی کنید ایراد کار از کجاست
در بانک ID 2 وجود داره ؟
این ارور برای خالی بودن سطر هست و بدین منظور که کوئری نتیجه ای بر نمیگردونه
استاد مشکل من هم همینجاست که چرا کوءری رو صحیح بر نمیگردونه؟
مثلا من روی دکمه ویرایش سطر با ID برابر با 1005 کلیک میکنم یا 1002 اما کوئری سطری که وجود نداره برمیگردونه
در بانک ستون با نام ID هست ولی در کوئری شما id درج شده
فکر کنم به حروف بزرگ و کوچک حساس باشه
این رو هم تست کردم استاد اما همون ارور رو میده!!
کد ها رو درست نوشتم؟ یعنی به همین طریق باید پست رو با دیتالیست ویرایش کرد؟
یک لینک باتن بذارم و توی کدنویسیش هم ریداریرکت کنم به صفحه ای که فرم ها هستن و بعدش توی اون صفحه این کدنویسی رو بکنم:
DAL run = new DAL(); DataTable dt = new DataTable(); string sqltext = string.Format("Select * From Tbl_Content Where ID={0} ", Request.QueryString["ID"]); dt = run.ExecuteQuery(sqltext); ID.Value = dt.Rows[0]["ID"].ToString(); Title.Text = dt.Rows[0]["Title"].ToString(); SmallText.Text = dt.Rows[0]["SmallText"].ToString(); LongText.Text = dt.Rows[0]["LongText"].ToString(); Subject.Value = dt.Rows[0]["SubjectID"].ToString(); Picture.Text = dt.Rows[0]["SmallPicture"].ToString();
اگر هم توی دستور سلکت هم شرط و رکوئست نذارم ارور نمیده و محتوا رو هم داخل فیلد ها و ادیتور ها میریزه اما مشکل اینجاست که محتوای مورد نظر رو نمیریزه. مثلا اگه روی باتن کلیک آی دی 1002 کلیک کنم یا هر کدوم دیگه کلیک کنم فقط محتوای اولین سطر موجود در دیتابیس رو میریزه!
ID رو چچک کردبد تا صحیح در کوئری قرار بگیره ؟
صحیح قرار نمیگیره
نمیفهمم مشکلش چیه که صحیح قرار نمیگیره
روی هر آی دی کلیک کنیم فقط آی دی اولین سطر موجود در دیتابیس در کوئری قرار میگیره
کد زیر چرا Id ثابت داره ؟
if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id=2"); }
چرا از e.CommandArgument پر نشده ؟
متوجه نمیشم!
یعنی به چه صورت بنویسم؟
آدرس صفحه ای که فیلد ها هستن که محتوا رو بریزیم توشون و ویرایش کنیم panel.aspx?id=2 هست
به شکل زیر بنویسید و تست کنید
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e) { if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id="+e.CommandArgument; } }
به این صورت که کلا غلط میشه استاد!!!!
اینجوری یه صفحه جدید ایجاد میشه
من در واقع از Web User Control استفاده کردم برای پنل. یک جدول دیتابیس به این صورت دارم:
در فیلد title عنوان و در فیلد name هم اسم web user control رو می نویسم:
تمام WebUserControl ها رو توی پوشه Controls که در پوشه Admin هست قرار دادم و این کدنویسی رو در صفحه Panel.aspx نوشتم:
public void LoadControl() { if (Request.QueryString["id"] != null) { if (Request.QueryString["ID"].ToString() != "") { string text = string.Format("select * from Tbl_Controls where id={0}", Request.QueryString["ID"].ToString()); DataTable dt = new DataTable(); DAL run = new DAL(); dt = run.ExecuteQuery(text); if (dt.Rows.Count > 0) { UserControl uc = (UserControl)Page.LoadControl("~/Admin/Controls/" + dt.Rows[0]["Name"] + ".ascx"); Container.Controls.Add(uc); } } } }
به این صورت اگر مثلا یک webusercontrol به اسم EditPost داشته باشم، توی دیتابیس یه سطر جدید درج میشه و اسمش قرار میگیره. حالا ID اون سطر هرچی باشه جلوی panel.aspx?id= قرار میگیره و صفحه EditPost رو میاره
حالا فرم های من در صفحه EditPost قرار دارن که آدرسش Panel.aspx?id=2 هست و این خروجی کار هست:
به همین دلیل هست که من اینجا از ID ثابت استفاده کردم:
if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id=2"); }
اگه به این صورت که گفتین بنویسم اونوقت آدرس صفحه عوض میشه و ریدایرکت میشه به یه صفحه ای که وجود نداره:
if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id=" + e.CommandArgument); }
مثلا اگه CommandArgument برابر با 1002 باشه اونوقت بعد از کلیک روی لینک باتن صفحه ریدایرکت میشه به Panel.aspx?id=1002 و این درحالی هست که اصلا در جدول Controls هیچ سطری با آی دی 1002 ثبت نشده و آدرس Panel.aspx?id=1002 در واقع یک صفحه سفید هست!
شما متوجه نشدید ایراد کار چیه استاد؟
نه متاسفانه
استاد نمیدونم اینجوری میشه یا نه!
الان رکوئست به این صورته:
protected void Page_Load(object sender, EventArgs e) { TextBox2.Text = Persia.Calendar.ConvertToPersian(DateTime.Now).Persian; DAL run = new DAL(); DataTable dt = new DataTable(); string sqltext = string.Format("Select * From Tbl_Content Where ID={0} ", Request.QueryString["ID"]); dt = run.ExecuteQuery(sqltext); ID.Value = dt.Rows[0]["ID"].ToString(); Title.Text = dt.Rows[0]["Title"].ToString(); SmallText.Text = dt.Rows[0]["SmallText"].ToString(); LongText.Text = dt.Rows[0]["LongText"].ToString(); Subject.Value = dt.Rows[0]["SubjectID"].ToString(); Picture.Text = dt.Rows[0]["SmallPicture"].ToString(); }
نمیشه رکوئست رو جوری نوشت که به جای ID در Request.QueryString["ID"] بتونیم e.CommandArgument رو قرار بدیم؟ آخه e.CommandArgument هم برابر با ID هست دیگه!!!!
میشه
امتحان کنید در رویداد Command از e.CommandArgument بگیرید و ارسال کنید
استاد فکر کنم تقریبا فهمیدم ایراد از کجاس اما نمیتونم درستش کنم
من الان یه if جدید گذاشتم
DAL run = new DAL(); DataTable dt = new DataTable(); string sqltext = string.Format("Select * From Tbl_Content Where ID={0} ", Request.QueryString["ID"]); dt = run.ExecuteQuery(sqltext); if (ID.Value == Request.QueryString["ID"]) { ID.Value = dt.Rows[0]["ID"].ToString(); Title.Text = dt.Rows[0]["Title"].ToString(); SmallText.Text = dt.Rows[0]["SmallText"].ToString(); LongText.Text = dt.Rows[0]["LongText"].ToString(); Subject.Value = dt.Rows[0]["SubjectID"].ToString(); Picture.Text = dt.Rows[0]["SmallPicture"].ToString(); TextBox2.Text = Persia.Calendar.ConvertToPersian(DateTime.Now).Persian; }
یعنی تا این سطر اجرا میشه:
dt = run.ExecuteQuery(sqltext);
و بعد براش شرط گذاشتم که اگه فیلد ID برابر با رکوئست بود، بعدش محتوا رو بریزه توی فیلد ها و ادیتور ها!
حالا ارور نمیده و اجرا میشه اما محتوا رو نمیریزه
در نتیجه یعنی اصلا رکوئست، ID رو نمیگیره چرا؟
البته استاد شما میگید در رویداد Command از e.CommandArgument بگیرم و ارسال کنم یعنی این کد رو باید تغییر بدم؟
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e) { if (e.CommandName == "Edit") { Response.Redirect("Panel.aspx?id=2"); } }
بله درسته
استاد میتونید سورسش رو بدید؟
هرچی مینویسم جور در نمیاد!!!
منظورتون رو متوجه نشدم
یعنی کدش رو بنویسم ؟
بله
من چند جور کدش رو نوشتم همش اشتباه بود
استاد از دیروز تا الان یک دقیقه نخوابیدم همش دارم به این ارور ور میرم دیگه مغزم نمیکشه
در اولین فرصتی که امروز گیرم بیاد کمکتون خواهم کرد
خیلی خیلی ممنون استاد
من باز هم همینجوری تلاش میکنم شاید درست شد
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)