PDA

View Full Version : سوال: مشکل در تعریف dropDownList در CodeBehind CSharp



kahe.mehrdad
دوشنبه 13 مرداد 1393, 14:23 عصر
سلام.
من چند تا DropDownList در سمت کد asp.net تعریف کردم که این ها درون یک لیست List<DropDownList> نگه داری میشه. حالا مشکل اینجاست که وقتی صحه لود میشه وقتی که تابع Init که این دراپ دان هارا میسازه را درون if(!IsPostBack) میگذارم با پست بک شدن صفحه دیگه اونها ظاهر نمیشند و اگر از if درشون بیارم با هر بار پست بک شدن دوباره میسازدشون. من میخوام این dropDown ها مانند دراپ دان هایی که با کنترل ها توی صفحه aspx میسازیم ظاهر بشند.
لطفا کمک کنید که چه شکلی میتونم مقایر این dropDown ها را نگه دارم و مشکل را رفع کنم؟

aminmousavi
دوشنبه 13 مرداد 1393, 15:34 عصر
سلام دوست عزیز ، نباید مشکلی داشته باشی ، احتمالا اشتباهت از جایی دیگست ، من تست کردم مشکلی نباید باشه ، کد زیر رو نگاه کن به راحتی کار میکنه :

protected void CreateCombo() {
for (int i = 0; i < 10; i++)
{
DropDownList dp = new DropDownList();
for (int j= 1; j <= 200; j++)
{
dp.Items.Add(j.ToString());
}
dp.AutoPostBack = true;
dp.SelectedIndexChanged += new EventHandler( DropDownList_SelectedIndexChanged);
box.Controls.Add(dp);
}
}
protected void DropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "alert", "alert('" + ((DropDownList)sender).SelectedValue + "');", true);
}
protected void Page_Load(object sender, EventArgs e)
{
CreateCombo();
}

sadegh.te
دوشنبه 13 مرداد 1393, 16:09 عصر
پست بک صفحه تو false کن

kahe.mehrdad
دوشنبه 13 مرداد 1393, 16:15 عصر
دوست من ممنون از جوابتون. زحمت کشیدید. ولی الان درواقع ما با یه تابع دیگه ، دیگه به دراپ دان هایی که تعریف کردیم دسترسی نداریم. در حقیقت من یه چیزی مثل تصویر زیر را میخوام.

لینک تصویر (http://i62.tinypic.com/et7e50.png)

که کاربر وقتی روی ذخیره کلیک کرد مقادیر selectedValue هر دراپ دان توی دیتابیس ذخیره بشه. به خاطر همین که با هر تابعی بتونم به این دراپدان ها دسترسی داشته باشم ببینید چه شکلی کد هام را تعریف کردم:


List<DropDownList> ListDropDownExternalParameters = new List<DropDownList>();


و


public void PresetExternalParameters()
{

ListDropDownExternalParameters.Clear();
foreach (var Param in linq.ExternalParameters.ToList())
{
DropDownList DropList = new DropDownList();
DropList.Attributes.Add("par_id", Param.id.ToString());
DropList.EnableViewState = true;
PanelExternalParameters.Controls.Add(DropList);
foreach (var item in linq.ExternalItems.OrderBy(n => n.value).Where(n => n.p_id == Param.id).ToList())
{
ListItem li = new ListItem(item.name, item.value.ToString());
li.Attributes.Add("item_id", item.id.ToString());
DropList.Items.Add(li);
}
}
}



دوست من ممنون میشم کمکم کنید.

aminmousavi
دوشنبه 13 مرداد 1393, 20:02 عصر
آهان ، مرسی از تیکه کد . مشکلتو درک کردم .
به نظرم اینکارو بکن :

1- متود PresetExternalParameters رو از
if(!IsPostBack) در بیار

2- برای اینکه selectindex هات هربار که دراپ دان ها رو مسازی ریست نشه مقدارهاشون روی کوئری استرینگ یا کوکی ذخیره کن (خودم کوئری رو ترجیح میدم)

3- نوی PresetExternalParameters که داری دراپ دان ها رو میسازی مقدار selectindex رو از کوئری بخون و روی دراپ دان ست کن .

4 - یک event برای دارپ دان هات بساز که هربار change میشن مقدار selectindex شون را با کوئری استرینگ جدید به همون صفحه جاری response.redirect کنن

امیدوارم منظورم رو خوب رستونده باشم و به کارت بیاد ، باز اگه فکر کردی کمکی از دستم بر میاد در خدمتم

kahe.mehrdad
دوشنبه 13 مرداد 1393, 21:18 عصر
آقا خیلی ممنون عالی بود.
فقط چون صفحه ام شلوغه نمیخوام اینقدر رفرش بشه صفحه. میدونم جای سوالم توی این پست نیست، ببخشید شما میدونید چه شکلی میشه postback های کنترل های asp مثل همین دراپ داون را ایجکسی کرد؟؟

aminmousavi
دوشنبه 13 مرداد 1393, 21:46 عصر
خواهش میکنم .
بله خیلی هم ساده هست
اگر در پروژه ات ScriptManager نداری کد زیر رو توی مسترپیجت بنداز ، دقت کن که حتما باید توی یک تگ runat=server باشد که معولا همه توی تگ فورم میندازن ، یاد باشه فقط هر صفحه فقط یک دونه میتونه ScriptManager داشته باشه ، وگرنه runtime error میده



<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>



بعد هر کنترلی که خواستی هنگام postback خوردن صفحه رفرش نشه رو درون کد زیر بنداز (که من فقط یکدونه دراپ دان انداختم ، محدودیتی برای کنترل انداختن توش نداری)




<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="DropDownList1" AutoPostBack="true" runat="server">
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>



به همین سادگی

kahe.mehrdad
سه شنبه 14 مرداد 1393, 10:38 صبح
امین جان خیلی ممنونم. واقعا لطف کردی. اسکریپت هایی که گفتید را اضافه کردم ولی توی مستر پیج اررور گرفته ازم. بنده توی خود تگ body مستر پیجم یک تگ form runat=server گذاشتم اما توی صفحه asp و تگ form این ارور را داده که تگ فرم صفحه asp داخل تگ فرم masterPage رفته ارور دقیقش این بود: A page can have only one server-side Form tag.



<!DOCTYPE html>
<!--[if lt IE 7]> <html class="lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]-->
<head>
<meta charset="utf-8">


<!-- Viewport Metatag -->
<meta name="viewport" content="width=device-width,initial-scale=1.0">


<!-- Plugin Stylesheets first to ease overrides -->
<link rel="stylesheet" type="text/css" href="<%= ResolveUrl("~/plugins/colorpicker/colorpicker.css")%>" media="screen">
<link rel="stylesheet" type="text/css" href="<%= ResolveUrl("~/custom-plugins/wizard/wizard.css")%>" media="screen">
.
.
.
.


<title>Asp.net Project</title>


</head>
<body>
<form runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>


<!-- Themer (Remove if not needed) -->
<div id="mws-themer">
<div id="mws-themer-css-dialog">
<form class="mws-form">
<div class="mws-form-row">
<div class="mws-form-item">
<textarea cols="auto" rows="auto" readonly="readonly"></textarea>
</div>
</div>
</form>
</div>
</div>
<!-- Themer End -->
.
.
.
</form>
</body>



البته من یه کار دیگه هم کردم اون تگ اسکریپت را آوردم توی خود صفحه asp گذاشتم. به این صورت.



<asp:Content ID="Content2" ContentPlaceHolderID="boundedcontent" runat="Server">
<div class="mws-panel grid_8">
<form id="form1" runat="server" class="mws-form">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:RadioButtonList ID="RadioButtonListThreats" runat="server" AutoPostBack="True" ViewStateMode="Enabled" OnSelectedIndexChanged="RadioButtonRiskVulEvent" ToolTip="اول انتخاب کنید و سپس کلید ذخیره در پایگاه داده را فشار دهید">
</asp:RadioButtonList>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</div>
<asp:Content>


به نظرم ایندفعه کار کرد چون دیگه با تغییر رادیو باتن ها postBack نداشتم ولی تغییری تو جاهای دیگه صفحه نداشتم. تصویر زیر را ملاحظه بفرمایید. بنده میخوام در پروژه ام هر وقت کاربر رادیو باتنی را کلیک کرد آسیپ پذیری هایی که بهش انتساب داده شده را با ایجکس از دیتا بیس بخونه و درون اون کلید های آبی نشون بده که بدون ایجکس دقیق کار میکنه اما وقتی به روش دوم (اسکریپت را به خود صفحه ASP) انجام دادم اون آیتم هایی که قبلا انتخاب شده بود دیگه نمی اومد.

تصویر پروژه (http://tinypic.com/view.php?pic=mjqo9y&s=8)

آقای موسوی عزیز باز هم عذر میخوام بحث طولانی شد.

kahe.mehrdad
سه شنبه 14 مرداد 1393, 12:59 عصر
امین جان مشکل رفع شد. من این تگ را که اضافه کردم درست شد:

<ContentTemplate>
<asp:RadioButtonList ID="RadioButtonListThreats" runat="server" AutoPostBack="True" ViewStateMode="Enabled" OnSelectedIndexChanged="RadioButtonRiskVulEvent" ToolTip="اول انتخاب کنید و سپس کلید ذخیره در پایگاه داده را فشار دهید">
</asp:RadioButtonList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="RadioButtonList1" EventName="SelectedIndexChanged" />
</Triggers>


</asp:UpdatePanel>