مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

moonfa1392

عضویت از 1394/08/17

مشکل در لینک باتن دیتالیست

  • پنجشنبه 24 تیر 1395
  • 21:18
تشکر میکنم

با سلام

جدول دیتابیس من به این صورت هست:

من یک دیتالیست قرار دادم به این صورت:

<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();
    }

ممنون میشم راهنمایی کنید ایراد کار از کجاست

پاسخ های این پرسش

تعداد پاسخ ها : 22 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 25 تیر 1395
  • 08:16

در بانک ID 2 وجود داره ؟

این ارور برای خالی بودن سطر هست و بدین منظور که کوئری نتیجه ای بر نمیگردونه

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 08:34

استاد مشکل من هم همینجاست که چرا کوءری رو صحیح بر نمیگردونه؟

مثلا من روی دکمه ویرایش سطر با ID برابر با 1005 کلیک میکنم یا 1002 اما کوئری سطری که وجود نداره برمیگردونه

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 25 تیر 1395
  • 15:10

در بانک ستون با نام ID هست ولی در کوئری شما id درج شده

فکر کنم به حروف بزرگ و کوچک حساس باشه

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 15:17

این رو هم تست کردم استاد اما همون ارور رو میده!!

کد ها رو درست نوشتم؟ یعنی به همین طریق باید پست رو با دیتالیست ویرایش کرد؟

یک لینک باتن بذارم و توی کدنویسیش هم ریداریرکت کنم به صفحه ای که فرم ها هستن و بعدش توی اون صفحه این کدنویسی رو بکنم:

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 کلیک کنم یا هر کدوم دیگه کلیک کنم فقط محتوای اولین سطر موجود در دیتابیس رو میریزه!

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 25 تیر 1395
  • 15:32

ID رو چچک کردبد تا صحیح در کوئری قرار بگیره ؟

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 15:36

صحیح قرار نمیگیره

نمیفهمم مشکلش چیه که صحیح قرار نمیگیره

روی هر آی دی کلیک کنیم فقط آی دی اولین سطر موجود در دیتابیس در کوئری قرار میگیره

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 25 تیر 1395
  • 15:38

کد زیر چرا Id ثابت داره ؟

   if (e.CommandName == "Edit")
        {
            Response.Redirect("Panel.aspx?id=2");
        }

چرا از e.CommandArgument پر نشده ؟

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 15:42

متوجه نمیشم!

یعنی به چه صورت بنویسم؟

آدرس صفحه ای که فیلد ها هستن که محتوا رو بریزیم توشون و ویرایش کنیم panel.aspx?id=2 هست

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • جمعه 25 تیر 1395
  • 15:43

به شکل زیر بنویسید و تست کنید

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "Edit")
        {
            Response.Redirect("Panel.aspx?id="+e.CommandArgument;
        }
    }

 

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 15:56

به این صورت که کلا غلط میشه استاد!!!!

اینجوری یه صفحه جدید ایجاد میشه

من در واقع از 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 در واقع یک صفحه سفید هست!

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • جمعه 25 تیر 1395
  • 19:52

شما متوجه نشدید ایراد کار چیه استاد؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 26 تیر 1395
  • 09:21

نه متاسفانه

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 26 تیر 1395
  • 18:04

استاد نمیدونم اینجوری میشه یا نه!

الان رکوئست به این صورته:

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 هست دیگه!!!!

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 26 تیر 1395
  • 18:20

میشه

امتحان کنید در رویداد Command از e.CommandArgument بگیرید و ارسال کنید

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 26 تیر 1395
  • 18:41

استاد فکر کنم تقریبا فهمیدم ایراد از کجاس اما نمیتونم درستش کنم

من الان یه 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 رو نمیگیره چرا؟

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 26 تیر 1395
  • 18:42

البته استاد شما میگید در رویداد Command از e.CommandArgument بگیرم و ارسال کنم یعنی این کد رو باید تغییر بدم؟

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
    {
        if (e.CommandName == "Edit")
        {
            Response.Redirect("Panel.aspx?id=2");
        }
    }

 

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 26 تیر 1395
  • 18:51

بله درسته

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 26 تیر 1395
  • 19:11

استاد میتونید سورسش رو بدید؟

هرچی مینویسم جور در نمیاد!!!

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 27 تیر 1395
  • 08:36

منظورتون رو متوجه نشدم

یعنی کدش رو بنویسم ؟

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 27 تیر 1395
  • 08:39

بله

من چند جور کدش رو نوشتم همش اشتباه بود angry

استاد از دیروز تا الان یک دقیقه نخوابیدم همش دارم به این ارور ور میرم دیگه مغزم نمیکشه

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 27 تیر 1395
  • 08:43

در اولین فرصتی که امروز گیرم بیاد کمکتون خواهم کرد

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 27 تیر 1395
  • 08:45

خیلی خیلی ممنون استاد

من باز هم همینجوری تلاش میکنم شاید درست شد

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)