PDA

View Full Version : سوال: ویرایش دو انتخابی ها



bftarane
یک شنبه 15 بهمن 1391, 12:00 عصر
سلام.
من امکان ثبت کاربر جدید رو به ادمین دادم.
و می یاد از طریق یه دراپ دان لیست جنسیت رو هم انتخاب می کنه.
و بر حسب انتخاب در دیتابیس male یا female ثبت میشه.
حالا من می خوام امکان ویرایش رو به ادمین بدم. راهی که به نظرم رسید اینه که در یه دراپدان لیست گزینه ای که در دیتابیس ثبت شده مثلاً (female) رو گزینه اول دراپ دان نشون بدم و بیام بر حسب اینکه در دیتابیس چی ثبت شده گزینه دوم رو به دراپ دان الحاق کنم یعنی اگه female ثبت شده بیام گزینه male رو الحاق کنم به دراپ دان تا اینجای کار رو هم تونستم انجام بدم ولی نمی دونم چه ایرادی در کارم هست که وقتی حالا در حالت ویرایش می یام گزینه ای رو از دراپ دان انتخاب می کنم گزینه انتخابی من رو نگه نمی داره و به قبلی برمی گرده
این کدهایی هست که دارم
لطفاً راهنمایی کنید.

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "change":
Username = e.CommandArgument.ToString();

DataTable dt= GetUserByUsername(Username);
string sex = "ggggggggg";
foreach (DataRow dr in dt.Rows)
{
txt_username.Text = dr["Username"].ToString();

sex = dr["Sex"].ToString();

}
if (sex == "female")
{
ddlsex.Items.Clear();

ddlsex.Items.Add(new ListItem("female", ""));
ddlsex.AppendDataBoundItems = true;
ddlsex.Items.Add(new ListItem("male", ""));

Response.Write("ggggggggg");


}
else
{
ddlsex.Items.Clear();
ddlsex.Items.Add(new ListItem("male", ""));

ddlsex.Items.Add(new ListItem("female", ""));

ddlsex.AppendDataBoundItems = true;


Response.Write("else");
}

ViewState["Username"] = Username;
MultiView1.ActiveViewIndex = 2;
break;
default:
break;
}

}

اوبالیت به بو
یک شنبه 15 بهمن 1391, 14:55 عصر
درود بر شما

چرا سخت کردید؟

DropDownList مربوط به جنسیت دارای دو آیتم هست: Female و Male. که شما اینها رو دستی به ddl اضافه کردید. Value اینها را چی قرار دادید؟ آیا گفتید Female = 1 و Male =2 یا اینکه نه Value همون Female و Male هست؟

اگر عدد گذاشتید پس در DataBase باید فیلد جنسیت رو عدد بگذارید. اگر نه باید خود مقدار رشته Female یا Male در فیلد جنسیت جدول پایگاه داده قرار بگیره. اما در هر دو صورت وقتی می خواید رکورد مورد نظر رو برای حالت ویرایش نشون بدید کافیه بنویسید:


ddlSex.SelectedValue = dr["Sex"].ToString();

البته منظورتون از این جمله یکم مبهمه:

حالا من می خوام امکان ویرایش رو به ادمین بدم. راهی که به نظرم رسید اینه که در یه دراپدان لیست گزینه ای که در دیتابیس ثبت شده مثلاً (female) رو گزینه اول دراپ دان نشون بدم و بیام بر حسب اینکه در دیتابیس چی ثبت شده گزینه دوم رو به دراپ دان الحاق کنم یعنی اگه female ثبت شده بیام گزینه male رو الحاق کنم

برای چی؟

bftarane
یک شنبه 15 بهمن 1391, 16:31 عصر
سلام.
بزارید با شکل توضیح بدم
99480
الآن این کاربر با جنسیت male در دیتابیس ثبت شده
حالا من می خوام یه دونه female هم در دراپ دان به عنوان گزینه دوم نشون داده بشه تا ادمین اگه خواست جنسیت رو female بزاره.
من با کدهای بالا می تونم دو تا گزینه male و female رو نشون بدم ولی وقتی ادمین گزینه دلخواهش رو انتخاب می کنه تست کردم متوجه شدم همون مقدار قبلی ثبت میشه چون دراپ دان مقداری که من انتخاب می کنم رو نگه نمی داره.

saadi2
یک شنبه 15 بهمن 1391, 19:49 عصر
کد های بایند کردن dropdownlist را داخل if not ispostback قرار دهید

bftarane
یک شنبه 15 بهمن 1391, 21:39 عصر
نه امتحان کردم این جوری دراپ دان خالی نشون داده میشه. اون !ispostback رو بعد از items.clear هم گذاشتم ولی اون طوری هم فقط یه آیتم دیده میشه.
البته من از دیتابیس بایند نکردما.
sex رو از دیتابیس می خونم و بر حسب اون آیتم بعدی رو به دراپ دان الحاق می کنم.
کدها رو این طوری نوشتم ولی دراپ دان این طوری خالی نشون داده میشه

sex = dr["Sex"].ToString();

}

if (sex == "female")
{
if (!IsPostBack)
{
ddlsex.Items.Clear();

ddlsex.Items.Add(new ListItem("female", ""));


ddlsex.AppendDataBoundItems = true;
ddlsex.Items.Add(new ListItem("male", ""));

Response.Write("ggggggggg");
}


}
else
{
if (!IsPostBack)
{

ddlsex.Items.Clear();

ddlsex.Items.Add(new ListItem("male", ""));


ddlsex.Items.Add(new ListItem("female", ""));

ddlsex.AppendDataBoundItems = true;


Response.Write("else");
}


}
فکر کنم یه توضیحی لازم باشه بدم من در رویداد لود دراپ دان رو بایند نمی کنم
یه گریدویو دارم داخل MultiView و با کلیک روی لینک ویرایش گریدویو به ویوی ویرایش می رم یعنی در واقع در GridView1_RowCommand وقتی command name برابر با change باشه دراپ دان پر میشه.

اوبالیت به بو
یک شنبه 15 بهمن 1391, 21:43 عصر
نه امتحان کردم این جوری دراپ دان خالی نشون داده میشه.
البته من از دیتابیس بایند نکردم ها.
sex رو از دیتابیس می خونم و بر حسب اون آیتم بعدی رو به دراپ دان الحاق می کنم.

فکر کنم یه توضیحی لازم باشه بدم من در رویداد لود دراپ دان رو بایند نمی کنم
یه گریدویو دارم داخل MultiView و با کلیک روی لینک ویرایش گریدویو به ویوی ویرایش می رم یعنی در واقع در GridView1_RowCommand وقتی command name برابر با change باشه دراپ دان پر میشه.
خوب اشتباه می کنید. شما اول میاید جنسیت رو می خونید هرچی بود مخالفش رو اضافه می کنید که کاربر این قابلیت رو داشته باشه که تغییر بده. خوب چه کاریه!

شما که نمی خواید از جایی DropDownList رو بایند کنید، بهتره از قسمت Properties کنترل Female و Male رو به بخش Items اون اضافه کنید. بعد از این کار وقتی می خواید مشخصات ادمین رو نشون بدید کافیه بنویسید:


ddlSex.SelectedValue = dr["Sex"].ToString();

bftarane
یک شنبه 15 بهمن 1391, 22:38 عصر
وای فکر کنم من دوباره لقمه رو دور سرم پیچوندم.:اشتباه:

bftarane
دوشنبه 16 بهمن 1391, 12:12 عصر
سلام.
من راه بالا رو امتحان کردم ولی الآن با این ارور مواجه میشم
'ddlsex' has a SelectedValue which is invalid because it does not exist in the list of items.
Parameter name: value

در قسمت html markup این کدها رو دارم

<asp:DropDownList ID="ddlsex" runat="server" AutoPostBack="True" AppendDataBoundItems="true">

<asp:ListItem Value="male">مرد</asp:ListItem>
<asp:ListItem Value="female">زن</asp:ListItem>

</asp:DropDownList>
و در code behind هم اینا رو دارم


if (dr.Read())
{



ddlsex.Items.Clear();

ddlsex.Items.Add(new ListItem( "مرد", "male"));
ddlsex.Items.Add(new ListItem( "زن", "female"));
ddlsex.AppendDataBoundItems = true;
ddlsex.SelectedValue = dr["Sex"].ToString();

}

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

dr.Read();

ddlsex.SelectedValue = dr["Sex"].ToString();
در دیتابیس هم male و female ذخیره کردم و چک کردم وجود هم دارن.
واقعاً نمی دونم چرا می گه این value وجود نداره در صورتی که وجود داره.
کلی هم سرچ زدم خیلیا با این مشکل درگیر بودن ولی نتیجه ای عایدم نشد.

bftarane
دوشنبه 16 بهمن 1391, 16:40 عصر
متوجه شدم مشکل از کجاست رفتم در دیتابیس نگاه کردم دیدم کنار رشته هایی که ذخیره کردم فاصله خالی هم ثبت شده ولی اصلاً نمی تونم بفهمم اون فاصله خالی ها برای چی ثبت میشه. فاصله خالیا رو پاک می کنم می یام ویرایش به خوبی انجام میشه حالا می یام دوباره ویرایش کنم با اون ارور بالایی مواجه میشم می رم می بینم دوباره تو دیتابیس فاصله خالی کنار female مثلاً ثبت شده.
خیلی برام عجیبه.

bftarane
دوشنبه 16 بهمن 1391, 16:59 عصر
حل شد مشکل.

من فیلدم در دیتابیس از نوع nvarchar(50) ولی در استور پروسیجر از نوع varchar(10) تعریف کرده بودم.

به پیشنهاد یکی از دوستان اون رو هم احتمالاً از نوع bit می زارم.

اوبالیت به بو
دوشنبه 16 بهمن 1391, 20:32 عصر
حل شد مشکل.

من فیلدم در دیتابیس از نوع nvarchar(50) ولی در استور پروسیجر از نوع varchar(10) تعریف کرده بودم.

به پیشنهاد یکی از دوستان اون رو هم احتمالاً از نوع bit می زارم.
کار درستی می کنید اما اگر bit گذاشتید مواظب باشید موقع چک کردن باید DropDownList شما قسمت Value آیتم ها سازگار با مقدار فیلد در بانک اطلاعاتی باشه.