PDA

View Full Version : سوال: دسترسی به مقادیر کنترلهای داینامیک



siolishe
چهارشنبه 04 فروردین 1395, 08:41 صبح
سلام
توی فرمی که دارم یک دکمه هست که با زدن اون هربار یه div به چند کنترل داخلش به صفحه اضافه میشه (با استفاده از jquery)
حالا مشکل اینجاست که دقیقا نمیدونم باید به چه شکل روی کنترلهای داینامیک برای گرفتم ID و text هر کنترل حلقه ایجاد کنم
تا یه حدودی انجام دادم ولی جواب نمیده لطفا از دوستان اگر کسی میدونه راهنمایی کنه


<div id="x" runat="server" >
<table id="y" class="repeat-role" runat="server">
<tr>
<td>
<h3>Title :</h3>
</td>
</tr>
<tr class="row">
<th class="hcell">dropdown :</th>
<td class="cell">
<asp:DropDownList ID="drpTasdigh" runat="server" CssClass="dropdown" Width="34%">
<asp:ListItem Value="0" Text="a" />
<asp:ListItem Value="1" Text="b" />
<asp:ListItem Value="2" Text="c" />
<asp:ListItem Value="3" Text="d" />
<asp:ListItem Value="4" Text="e" />
<asp:ListItem Value="5" Text="f" />
</asp:DropDownList>
&nbsp type : &nbsp
<asp:RadioButtonList ID="radTType" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="False" Text="temp" />
<asp:ListItem Value="True" Text="final" />
</asp:RadioButtonList>
</td>
<td></td>
</tr>
<tr class="row">
<th class="hcell">amount:</th>
<td class="cell">
<asp:TextBox ID="txtTasdighAmount" runat="server" Width="86%" ClientIDMode="Static"></asp:TextBox>&nbsp ريال
</td>
<td>
<asp:ImageButton runat="server" ImageUrl="~/images/Icon/addbtn.png" CssClass="add-role" />
<asp:ImageButton runat="server" ImageUrl="~/images/Icon/remove.png" CssClass="remove" Width="24px" />
</td>
</tr>
</table>
<hr />
</div>

و کد c# :
for (int i = 1; i <= Convert.ToInt16(hidTaghsimCount.Value); i++)
{
foreach (System.Web.UI.Control div in financial.Controls.OfType<HtmlGenericControl>())
{
var ctrl = (HtmlGenericControl)div;
if (ctrl.TagName == "div")
{
TblCreditorsTa newTa = new TblCreditorsTa();
var textbox1 = new TextBox { ID = "txtTasdighAmount" + i.ToString() };
newTa.Amount = Convert.ToInt32(textbox1.Text);
db.TblCreditorsTas.Add(newTa);
db.SaveChanges();
}
}
}

siolishe
پنج شنبه 12 فروردین 1395, 19:23 عصر
دوستان یعنی کسی تا حالا به این مورد بر نخورده؟ اساتید کسی جواب رو نمیدونه؟
من فکر میکنم چون کنترلها بصورت داینامیک و با jQuery ایجاد شده تو postback چیزی بر نمیگرده
امکانش هست که بشه با viewstate این مشکل رو حل کرد؟

keiv@n
جمعه 13 فروردین 1395, 04:56 صبح
سلام
توی فرمی که دارم یک دکمه هست که با زدن اون هربار یه div به چند کنترل داخلش به صفحه اضافه میشه (با استفاده از jquery)
حالا مشکل اینجاست که دقیقا نمیدونم باید به چه شکل روی کنترلهای داینامیک برای گرفتم ID و text هر کنترل حلقه ایجاد کنم
تا یه حدودی انجام دادم ولی جواب نمیده لطفا از دوستان اگر کسی میدونه راهنمایی کنه


<div id="x" runat="server" >
<table id="y" class="repeat-role" runat="server">
<tr>
<td>
<h3>Title :</h3>
</td>
</tr>
<tr class="row">
<th class="hcell">dropdown :</th>
<td class="cell">
<asp:DropDownList ID="drpTasdigh" runat="server" CssClass="dropdown" Width="34%">
<asp:ListItem Value="0" Text="a" />
<asp:ListItem Value="1" Text="b" />
<asp:ListItem Value="2" Text="c" />
<asp:ListItem Value="3" Text="d" />
<asp:ListItem Value="4" Text="e" />
<asp:ListItem Value="5" Text="f" />
</asp:DropDownList>
&nbsp type : &nbsp
<asp:RadioButtonList ID="radTType" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow">
<asp:ListItem Value="False" Text="temp" />
<asp:ListItem Value="True" Text="final" />
</asp:RadioButtonList>
</td>
<td></td>
</tr>
<tr class="row">
<th class="hcell">amount:</th>
<td class="cell">
<asp:TextBox ID="txtTasdighAmount" runat="server" Width="86%" ClientIDMode="Static"></asp:TextBox>&nbsp ريال
</td>
<td>
<asp:ImageButton runat="server" ImageUrl="~/images/Icon/addbtn.png" CssClass="add-role" />
<asp:ImageButton runat="server" ImageUrl="~/images/Icon/remove.png" CssClass="remove" Width="24px" />
</td>
</tr>
</table>
<hr />
</div>

و کد C#‎ :
for (int i = 1; i <= Convert.ToInt16(hidTaghsimCount.Value); i++)
{
foreach (System.Web.UI.Control div in financial.Controls.OfType<HtmlGenericControl>())
{
var ctrl = (HtmlGenericControl)div;
if (ctrl.TagName == "div")
{
TblCreditorsTa newTa = new TblCreditorsTa();
var textbox1 = new TextBox { ID = "txtTasdighAmount" + i.ToString() };
newTa.Amount = Convert.ToInt32(textbox1.Text);
db.TblCreditorsTas.Add(newTa);
db.SaveChanges();
}
}
}


خیلی نا مفهومه سوالتون لطفا واضح تر بیان کنید

siolishe
جمعه 13 فروردین 1395, 07:12 صبح
فکر میکردم کدها کاملا گویا باشن!
ببینین یه دکمه تو صفحه هست که توسط jQuery یه div که شامل چندتا کنترلر (textbox,dropdown list,radiobutton) هست رو به ازای هر بار کلیل تو صفحه به ضورت داینامیک اضافه میکنه
حالا تو code behind میخوام به مقادیر این کنترلهای داینامیک دسترسی داشته باشم ولی ظاهرا به دلیل اینکه توسط jquery ساخته شدن نمیشه بهشون دسترسی داشت یعنی تو حلقه foreach نمیتونم مقادیرشون رو بخونم
این موردم در نظر گرفتم که هر کنترلر جدید یه id مجزا داره
البته این کد بالا داره جواب میده ولی این در صورتیکه تعداد دفعات تکرار div مذکور رو بهش بدم در صورتیکه میخوام خودکار به ازای هر div و بدون مشخص کردن تعداد بصورت دستی این کار انجام بشه

keiv@n
جمعه 13 فروردین 1395, 08:05 صبح
این کار شدنی نیست
اگر با استفاده از جی کوئری به صفحه عناصری را اضافه کنید پس از postBack این عناصر از بین خواهند رفت چون که این عناصر به DOM اضافه نشده اند و نیز در viewState وجود نخواهند داشت
اگر تنها value این عناصر برای شما مهم است پیشنهاد میشه اونهارو در فیلد های input مخفی (Hidden) قرار دهید و در سمت code behind از آنها استفاده کنید
http://stackoverflow.com/questions/1425964/jquery-append-code-behind
http://stackoverflow.com/questions/19550007/get-append-control-value-from-code-behind-in-asp-net

siolishe
جمعه 13 فروردین 1395, 08:32 صبح
غیر ممکن که نیست چون با Request.Form به کنترلها دسترسی دارم
درواقع میخوام توی کد زیر به نحوی حلقه for حذف بشه و فقط از foreach استفاده کنم


if (txtTasdighAmount.Value.Length != 0)
{
for (int i = 1; i <= Convert.ToInt16(hidTaghsimCount.Value); i++)
{
foreach (System.Web.UI.Control div in financial.Controls.OfType<HtmlGenericControl>())
{
//var ctrl = (HtmlGenericControl)div;
if (div.ClientID.Contains("tasdighdiv"))
{
TblCreditorsTa newTa = new TblCreditorsTa();
var CNo = Convert.ToInt16(txtCaseNumber.Text);
newTa.Creditors_id = (from x in db.TblCreditors where x.CaseNumber == CNo select x.id).FirstOrDefault();
if (i == 1)
{
newTa.Type = Convert.ToBoolean(Request.Form["radTasdighType"]);
newTa.Floor = Convert.ToByte(Request.Form["drpTasdigh"]);
newTa.Amount = Convert.ToInt32(Request.Form["txtTasdighAmount"]);
}
else
{
newTa.Type = Convert.ToBoolean(Request.Form["radTasdighType" + i]);
newTa.Floor = Convert.ToByte(Request.Form["drpTasdigh" + i]);
newTa.Amount = Convert.ToInt32(Request.Form["txtTasdighAmount" + i]);
}
newTa.RecordNo = Convert.ToByte(i);

db.TblCreditorsTas.Add(newTa);
db.SaveChanges();
}
}
}
}