PDA

View Full Version : سوال: چرا فیلدهای dropdownlist دوباره تکرار میشه؟؟؟



omidrayaneh.68
یک شنبه 13 تیر 1389, 09:56 صبح
سلام عرض شده چرا وقتی که هر بار رویدادی در صفحه اجرا میشه این dropdownlist مقادیرش دو برابر میشه مثلا اگه دو تا اسم داشته باشیم بعد از یک کار کوچیک مثلا زدن یک دکمه به 4 تا اسم تبدیل میشه؟
اگر کدش را دقیقا بزارید ممنون میشم..
باتشکر:لبخند:

A.S.Roma
یک شنبه 13 تیر 1389, 10:04 صبح
توی Page_Load قبل از Bind کردن دیتاسورس به DropDownList این خط رو وارد کنید.
drpList.Items.Clear();
یا قسمت بایند کردن دیتا به کنترل را در این شرط قرار دهید :
if(!Page.IsPostBack)
{
//Coe Here ...
}

omidrayaneh.68
یک شنبه 13 تیر 1389, 11:19 صبح
با تشکر از شما دوست عزیز مشکل حل شد اما یه مشکل جدید اضافه شد

Mostafa_Dindar
یک شنبه 13 تیر 1389, 11:29 صبح
کدی که دوست خوبم A.S.Roma گذاشتند صحیح کار میکند , ولی نباید از خودمون بپرسیم چرا در هر PostBack داده های کترل رو پر و خالی کنیم ?

خوب بهتره رویدادی که داده های DropDownList رو پر میکنه , تنها یک بار فراخوانی بشه ,اونهم تنها دفعه اول و دفعات بعد از ViewState استفاده کنه .

بهتره که متد مقدار دهی به DropDownList در شرط
//Load Event
if(!IsPostBack)
{
fillDropDownList();
}

صورت بگیره

موفق باشید

omidrayaneh.68
یک شنبه 13 تیر 1389, 12:06 عصر
آقا خسته نباشید مشکل بنده حل شد اما ظاهرا یک مشکل بزرگتر پیش اومده و اینه که وقتی از dropdownlist یک گزینه انتخاب میکنم فقط گزینه اول در دیتابیس ذخیره میشه مثلا اگر سنگی را بزنم فقط بتونی ثبت میشه چون پیشفرضه و این داده غلط در دیتابیس ثبت میشه عکس: توجه داشته باشید که اطلاعات dropdownlist همان اطلاعات جدول است یعنی هیچ additeme صورت نگرفتهhttp://www.Free-Picture-Host.com/images/tn_jG8AzK1278227868.jpg
حالا من کد های اساسی که به کار بردم را میزارم



protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
showdata();
showcomsaghf();
}

اینم تابع show data برای نمایش اطلاعات جدول در گرید ویو که بالا در لود صداش زدم



public void showdata()
{
SqlConnection con = new SqlConnection();
string cs = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto ry|\\amlakweb.mdf;Integrated Security=True;User Instance=True";
con.ConnectionString = cs;
con.Open();
cmd.Connection = con;
cmd.CommandText = "Select * from forosh ";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
con.Close();
dgforush .DataSource = dt;
dgforush.DataBind();
}

اینم تابع showcomsaghf برای ریختن اطلاعات جدول درون dropdownlist



public void showcomsaghf()
{
SqlConnection con = new SqlConnection();
con.ConnectionString = cs;
con.Open();
cmd.Connection = con;
cmd.CommandText = "Select name_saghf from saghfha ";
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
con.Close();
comsaghf .DataSource = dt;
comsaghf.Items.Clear();
comsaghf.DataBind();
}

اینم دکمه ذخیره برای ثبت اطلاعات



protected void btnsave_Click(object sender, ImageClickEventArgs e)
{

con.ConnectionString = cs;
cmd.Connection = con;
cmd.CommandText = string.Format("insert into forosh(type,melk,tabaghe,ghedmat,vahed,metraj,addr ess,emkanat,emkanat_ezafe,nema,mantaghe,tedad_otag h,price,name_malek,saghf,shekl_zamin,type_koche,va zeat)values (N'{0}',N'{1}',N'{2}',N'{3}',N'{4}',N'{5}',N'{6}', N'{7}',N'{8}',N'{9}',N'{10}',N'{11}',N'{12}',N'{13 }',N'{14}',N'{15}',N'{16}',N'{17}')", comtype.Text, commelk.Text, comtabaghe.Text, txtghedmat.Text, txtvahed.Text, txtmetraj.Text, txtaddress.Text, txtemkanat.Text, txtemkanatezafe.Text, comnema.Text, commantaghe.Text, txttedadotagh.Text, txtprice.Text, commalek.Text, comsaghf.Text, comashkal.Text, txtkoche.Text, txtvaziyat.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
lblmessage.Text = ("اطلاعات با موفقیت ثبت شد");
showdata();


}

حالا به نظ شما دوستان مشکل من کجاست...

Vahid_moghaddam
یک شنبه 13 تیر 1389, 12:21 عصر
1. از روش سه لایه برای ارتباط با DB استفاده کنید.
2. نوشتن insert به این شکل احتمال sql injection رو بوجود میاره. از پارامتر ها استفاده کنید یا از روش های دیگه برای کار با دیتابیس مثل LinqToSql
3. برای بدست اوردن مقدار DropDownList از SelectedItem استفاده کنید

omidrayaneh.68
یک شنبه 13 تیر 1389, 12:29 عصر
بله شما درست عرض کردید اما بنده به ناچار از این روش رفتم و بیش تر کارم را از این روش پیش بردم و دیگه چاره ایی ندارم که از همین راه این مشکل را حل کنم باز هم تشکر اگر دوستان راه حلی به نظرشان رسید ما را بی نصیب نکنید...

A.S.Roma
یک شنبه 13 تیر 1389, 12:37 عصر
قسمتی که داری Insert رو می سازی از این دستور استفاده کن :
comsaghf.SelectedItem.Text

omidrayaneh.68
یک شنبه 13 تیر 1389, 13:03 عصر
با تشکر همین کار را کردم اما مشکلم حل نشد حالا چی کار کنم؟؟؟؟!!!!:ناراحت:
راستی من خاصیت appenddatabounditem را برای Dropdownlist هام فعال کردم اما داده ها دوباره تکرار میشه اگه این کا را نکنم همان مقدار پیش فرض ذخیره میشه:ناراحت::ناراحت:

omidrayaneh.68
چهارشنبه 16 تیر 1389, 20:04 عصر
اگر کسی راه حل اساسی به همین کدا داره ما را بی نصیب نکنه.....

nafasak
پنج شنبه 17 تیر 1389, 14:59 عصر
1. از روش سه لایه برای ارتباط با DB استفاده کنید.
2. نوشتن insert به این شکل احتمال sql injection رو بوجود میاره. از پارامتر ها استفاده کنید یا از روش های دیگه برای کار با دیتابیس مثل LinqToSql
3. برای بدست اوردن مقدار DropDownList از SelectedItem استفاده کنید
وحید جان،
آیا sql injection فقط در Insert و Update صورت میگیره؟

Vahid_moghaddam
پنج شنبه 17 تیر 1389, 15:17 عصر
وحید جان،
آیا sql injection فقط در Insert و Update صورت میگیره؟
نه در Select هم می تونه باشه. مثال:


select name where password='aaa'
select name where password='aaa' or 1=1; --