ورود

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



V0R73X
پنج شنبه 19 خرداد 1390, 23:14 عصر
با سلام به دوستان عزیز:
چطوری به یک کنترل که داخل یک Container هست (مثل DIV یا Panel) میشه دسترسی پیدا کرد؟ در حالت معمولی اینکار امکان پذیر نیست چون از Code-Behind که امتحان کردم المنت هایی که توی یک Container بودن ناشناخته بودن!
نظرتون چیه؟

raziee
جمعه 20 خرداد 1390, 23:50 عصر
ساده ترین راه اینه که اون کنترل رو تبدیل به کنترل دات نت کنید.
اون وقت دسترسی خواهید داشت.
و اگر نمیخواهید این کار رو انجام بدید باید در زمان رندرینگ اون قسمت رو پیدا کنید.

چه پردازشی قرار هست انجام بدید؟
HTML مربوطه رو قرار بدید.

baha_film
شنبه 21 خرداد 1390, 08:55 صبح
منم برای دسترسی به کنترل های داخل GridView همین مشکل رو دارم
در حالت عادی هر کنترل با ID قابل دسترسی و کد نویسی هست ولی وقتی تو ItemTemplate میزارم دیگه نمیتونم بهشون دسترسی داشته باشم
ممنون میشم در این مورد هم راهنمایی کنید

V0R73X
شنبه 21 خرداد 1390, 12:54 عصر
ساده ترین راه اینه که اون کنترل رو تبدیل به کنترل دات نت کنید.
اون وقت دسترسی خواهید داشت.
و اگر نمیخواهید این کار رو انجام بدید باید در زمان رندرینگ اون قسمت رو پیدا کنید.

چه پردازشی قرار هست انجام بدید؟
HTML مربوطه رو قرار بدید.
ممنون از کمکتون کنترل های من ها دات نت بودن. ولی من فهمیدم که باید از متد FindControl استفاده کرد و یعد کنترل یافته شده رو به یک نمونه از نوعش نسبت داد. منتها الان یک مشکل دیگه دارم کد رو هم حتما میزارم چون لازمه ببینین.
مشکل اینجاست که من یک پنل دارم به نام ResultsPanel و با متد FindControl اونو پیدا میکنم ولی ارور Null Reference میگیرم وقتی میخوام ازش استفاده کنم! این یعنی اینکه کنترل من پیدا نشده، ولی من میدونم که هست و اشتباه تایپی هم نیست!! بدجوری گیر کردم خودتون کد رو نگاه کنید:

<%@ Page Language="C#" MasterPageFile="~/design/MasterPage.master" ValidateRequest="false" AutoEventWireup="true" CodeFile="SearchResults.aspx.cs" Inherits="_SearchResults" Title="Sam Car Sell" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Import Namespace="Artisteer" %>
<%@ Register TagPrefix="artisteer" Namespace="Artisteer" %>
<%@ Register TagPrefix="art" TagName="DefaultMenu" Src="DefaultMenu.ascx" %>
<%@ Register TagPrefix="art" TagName="DefaultHeader" Src="DefaultHeader.ascx" %>
<%@ Register TagPrefix="art" TagName="DefaultSidebar1" Src="DefaultSidebar1.ascx" %>
<%@ Register TagPrefix="kia" TagName="CarView" Src="~/CarView.ascx" %>
<%@ Reference Control="CarView.ascx" %>

<asp:Content ID="HeaderContent" ContentPlaceHolderID="HeaderContentPlaceHolder" Runat="Server">
<art:DefaultHeader ID="DefaultHeader" runat="server" />
</asp:Content>
<asp:Content ID="MenuContent" ContentPlaceHolderID="MenuContentPlaceHolder" Runat="Server">
<art:DefaultMenu ID="DefaultMenuContent" runat="server" />
</asp:Content>
<asp:Content ID="SideBar1" ContentPlaceHolderID="Sidebar1ContentPlaceHolder" Runat="Server">
<art:DefaultSidebar1 ID="DefaultSidebar1Content" runat="server" />
</asp:Content>

<asp:Content ID="SheetContent" ContentPlaceHolderID="SheetContentPlaceHolder" Runat="Server">
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:MyCon %>"
ProviderName="<%$ ConnectionStrings:MyCon.ProviderName %>"
SelectCommand="SELECT * FROM Cars WHERE model=@model OR make=@make OR Year=@year">
<SelectParameters>
<asp:QueryStringParameter Name="Model" QueryStringField="model" />
<asp:QueryStringParameter Name="make" QueryStringField="make" />
<asp:QueryStringParameter Name="Year" QueryStringField="Year" />
</SelectParameters>
</asp:SqlDataSource>

<artisteer:Article ID="Article1" Caption="Search Results:" runat="server"><ContentTemplate>
<asp:Panel ID="ResultsPanel" runat="server">
</asp:Panel>
</ContentTemplate></artisteer:Article>
</asp:Content>

اینم Code-Behind:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class _SearchResults : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.PreRender += new System.EventHandler(this.Page_PreRender);
}
protected void Page_PreRender(object sender, EventArgs e)
{
SqlDataReader reader;
Panel ResultsPanel = (Panel) Article1.FindControl("ResultsPanel");
ResultsPanel.BorderStyle = BorderStyle.Dashed;
try
{
reader = (SqlDataReader)SqlDataSource1.Select(DataSourceSel ectArguments.Empty);
if (reader.IsDBNull(1))
{
if (reader.HasRows)
{
while (reader.Read())
{
UserControl NewCar = (UserControl)Page.LoadControl("CarView.ascx");
string MyTitle = reader["make"] + " " + reader["model"];
((CarView)NewCar).setData(MyTitle, reader["ImageUrl"].ToString(), reader["make"].ToString(), reader["Model"].ToString(), reader["Year"].ToString(), reader["price"].ToString(), reader["Color"].ToString(), reader["mileage"].ToString());
ResultsPanel.Controls.Add(NewCar);
}
reader.Close();
}
else
{
Label errlbl = new Label();
errlbl.Text = "We're sorry. We didn't find any match for your search!<br/>";
ResultsPanel.Controls.Add(errlbl);
}
}
else
{
Label errlbl = new Label();
errlbl.Text = "We're sorry. You're probably misdirected to this page!<br/>";
ResultsPanel.Controls.Add(errlbl);
}
}
catch (Exception err)
{
Label errlbl = new Label();
errlbl.Text = "We're sorry. An error occured during the process:!<br/>";
errlbl.Text += err.Message;
ResultsPanel.Controls.Add(errlbl);
}
}
}

دقت کنید تو یکی از این خط ها تو کد بالا من BorderStyle به پنل نسبت میدم ولی ارور Null Reference میگیرم هرچند ارور اصلی اولین بار توی خط آخر پیش اومد یعنی همونجایی که Label رو میخوام به پنل اد کنم ولی به هر حال... نمیدونم چرا!!!؟!
از کمکتون خیلی خیلی ممنونم...
دوست عزیزمون هم که مشکل قبلی منو داشتین به کد دقت کنید حل میشه (البته امیدوارم!! مثه من نشه!)

V0RTEX
دوشنبه 23 خرداد 1390, 13:07 عصر
من به این نتیجه رسیدم که FindControl فقط برای panel و کلا Containerها کار میکنه
مثلا این کد کار می کنه:

Button1.Text = Convert.ToString(Panel1.FindControl("hello").ClientID);

ولی این کار نمی کنه :متفکر:

Button1.Text = Convert.ToString(this.FindControl("hello").ClientID);

V0RTEX
دوشنبه 23 خرداد 1390, 13:12 عصر
راه حل:
البته می دونم راه خوبی نیست ولی فعلا این به ذهنم رسیده چیز بهتر پیدا کردم می گم:لبخندساده:
و اما از راه حل: باید کل کنترل هایی رو که می خواید Find کنید تو یه Container بزارین:متفکر: :لبخند:

V0R73X
دوشنبه 23 خرداد 1390, 20:13 عصر
سلام.
این چیزی که میگین ۲ مشکل داره: Article1 اسم پیج نیست یه User Controlه. ۲. من کنترل و از Code-Behind عدد نکردم تو Mark-up گذشتم.
به کد ۱ بر دیگه دقت کنید: پنل صاف توی Article1 هست، پس Containerش همون Article1 هست و منم از پیج استفاده نکردم برای پیدا کردنش.
در واقع شما دارین میگی‌ن که یه کنترل رو باید از اولین Parentش سرچ کرد، درسته؟ خوب، Article1 هم اولین Parent اون ResultsPanel هست...
ولی‌ من خودم به این نتیجه رسیدم که این یوزر کنترل‌ها پر از باگن. پر از باگ، مخصوصاً اگه توشون کنترل بذاری و واسه اون کنترل‌ها برنامه نویسی کنی‌، مثلا اونیکی تاپیکمو دیدین؟
http://forums.asp.net/p/۱۶۸۸۴۱۲/۴۴۵۷۲۷۰.aspx/۱?Re+DropDownList+in+User+Control+Doesn+t+display +the+right+value
من این Article1 رو که حذف کردم هم چی‌ حل شد!! ولی‌ اگه بذاریش، حتا Article1.Contros.Add(...) هم کار نمی‌کنه.
تاپیک بالا رو یه نگاهی‌ بنداز: خودت برو امتحان کن از باگش خندت میگیره!! D:
راستی چرا ClientID؟؟ مگه اسکریپت جاوا میخوایم واسش بنویسیم؟ تو همون سرور پیداش می‌کنیم همونجا هم واسش کدنویسی می‌کنیم درست نمیگم؟ D:

V0R73X
شنبه 28 خرداد 1390, 05:47 صبح
سلام. الان حدود یک هفته است که از آخرین پست بنده میگذرد ولی هیچکس هیچ جوابی نداده...
اگه بخوایم از متد FindControl استفاده کنیم میشه، ولی حالا فرض میکنیم 10 تا کنترل داریم داخل یک Container بعد واسه هر 10 تاشون باید این متد رو استفاده کرد و با Casting کنترل دلخواه رو به دست آورد، تازه معملومم نیست که پیدا بشه یا نه مثل همین مثال قبلی من. حالا اگه 100 تا کنترل داشته باشیم چی؟؟
یعنی هیچ راهی نیست که یه کنترل رو داخل یک Container HTML بندازیم و بشه براش کد بنویسیم؟؟ آخه از طرفی هم نمیشه کنترل هایی مثل Fieldset یا Marquee رو بیخیال شد، چون معادل ASP ندارن! حالا ما چطوری واسه کنترل های داخل اینا کد نویسی کنیم؟
کسی راهی نداره؟

V0R73X
شنبه 28 خرداد 1390, 05:49 صبح
راه حل:
البته می دونم راه خوبی نیست ولی فعلا این به ذهنم رسیده چیز بهتر پیدا کردم می گم:لبخندساده:
و اما از راه حل: باید کل کنترل هایی رو که می خواید Find کنید تو یه Container بزارین:متفکر: :لبخند:
اینکه نمیشه دوست عزیز، اونموقع اون Container ی که شما میفرمایید خودش داخل یک Container دیگه قرار میگیره و دیگه نمیشه براش کد نوشت...