دسترسی به TemplateField

M.U.T

Member
سلام.
من یک GridView سفارشی ساختم که کاربر بتونه با کلیک روی سرستون ،grid رو بر اساس اون ستون بدون اینکه هیچ Overloading و Event Handling انجام بده.این کار انجام شده.من برای انجام این کار باید به DataField دسترسی داشته باشم.
اما مشکل من اینه که من فقط به DataField هایی دسترسی دارم که نوع ستون اونا از نوع DataBoundField هست.در صورتی که ممکنه هر برنامه نویسی که از Grid من استفاده میکنه ستونی از نوع TemplateField هم تعریف کنه.حالا من می خوام به فیلدی که کنترل داخل TemplateFiled رو پر می کنه یعنی همون
Bind("Name"(
یا
Eval("Name")
دسترسی داشته باشم.یعنی
اول به کنترلی که در TemplateField قرار داره دسترسی پیدا کنم.و بعدش به فیلدی که بهش Bind شده (که در بالا Name) هست دسترسی پیدا کنم.
مثال زیر نحوه دسترسی به HeaderText و DataField ستون از نوه DataBoundField هست.ولی من می خوام به DataField و HeaderText ستون از نوع TemplateFiled دسترسی پیدا کنم.

for (int j = 0; j < this.Columns.Count; j++)
{
BoundField bf;
bf = this.Columns[j] as BoundField;
if (bf != null)
{
string ht = bf.HeaderText;
string df = bf.DataField;
}
}
تشکر فراوان
 

r_boy

New Member
برای دسترسی به کنترل هایی که تو تمپلیت قرار دارن :
فرض کنید توی تمپلیت یه کنترل داریم به نام image1 :
[for i=0 to gridview1.rows.count-1

DirectCast(gridview1.Rows(i).FindControl("Image1"), Image).ImageUrl ="photo/1.jpg

next

حالا اگه واضح نیست بیشتر توضیح بدم
 

M.U.T

Member
نه کاملا واضح بود.
مشکل همینجاست که من نمی دونم اسم کنترل چیه؟کاربران مختلفی از گرید من استفاده می کنند و ممکنه تو تمپلیت فیلدشون هر کنترلی با هر اسمی بذارن.
ولی من یک راهی پیدا کردم برای دسترسی به کنترل های داخل تملیت فیلد:
به ازای هر ردیف از گرید این کار انجام شه:(for grid.rows)
for (int i = 0; i < Grid.Columns.Count; i++)
{
TemplateField tf = Grid.Columns asTemplateField;
Control cont=newControl();
if (tf != null)
{
tf.ItemTemplate.InstantiateIn(cont);
}
}
حالا کنترل cont مطمئنا دارای چند کنتزله که یکیش همونیه که ما مد نظر داریم
این کد به ازای هر ردیف اگه اجرا شه،دونه دونه ستون ها رو پیمایش می کنه و اگه نوع ستونشون از ن.ع templatefield بود مقدار tf پر میشه در نتیجه cont هم پر میشه.
من هر بار با هر حالتی امتحان کردم(وقتی تو تمپلیت فیلدم یک کنترل گذاشته بودم) اون متغیر cont دارای 3 زیر کنترل بود که اولی و سومیش از نوع literal control بودن و دومی همون کنترل من بود.
اما آیا هر بار اینجوریه؟!!
 
آخرین ویرایش:

fredd

New Member
البته راه بهتر نیز هیست
کد:
<asp : TemplateField HeaderText="Status">
<ItemTemplate>
<asp:ImageButton Id="ImageButton1" runat="server"
CommandName="Click"
CommandArgument='<%# Eval("ProductId")' %>
</ItemTemplate>
</asp:TemplateField>
و اما برای شناسایی کنترل درون تمپلیت رویداد gridview.RowCommand که به اعضای هر رکورد در گرید اجرا می شود
.( protected void gridview_rowcommand(object sender,gridviewcommandeventargs e)
 

jefri600

New Member
با سلام خدمت اساتید محترم
می دوونم که سوالم تکراری هست ولی تمام راهنمایی هایی رو که در جستجو مطالعه کردم باز هم مشکل من حل نشده
1. کار در محیط وب هست
2. یک جدول دارم با سه فیلد a,b,c
3. یک گریدویو دارم که می خوام اونهایی رو نمایش بده که شرط خواصی داره
پس بنابر این ترتیب اطلاعات ، به ترتیبی که در جدول هست در گریدویو نخواهد بود(در جدول 1.2.3.4.5... ولی در گرید ویو 3.4.5.6...)
4. در گریدویو یک کنترل لینک باتم دارم که می خوام با کلیک بر روی اون مقدار textخود لینک باتم (که از جدول گرفته شده) و یک کنترل دیگه (که عکس هست و مقدار imageUrl اون مد نظره) را در یک متغییر بریزم (در کل کشیدن این مقادیر به بیرون از گریدویو مدنظر هست)
کد هایی هم که نوشتم به شکل زیر هست:
شکل گریدویو:

HTML:
<asp:GridView ID="gvViewF" runat="server" Width="100%" 
AutoGenerateColumns="False" onrowcommand="gvViewF_RowCommand">
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<table cellpadding="3" cellspacing="0" bgcolor="White" dir="rtl" width="100%">
<tr>
<td width="45">
<asp:ImageButton ID="imgBtnF" runat="server" 
CommandArgument='<%# Eval("id") %>' Height="45px" ImageUrl='<%# Eval("pic","images/userPic/{0}") %>' 
Width="45px" CommandName="sendMess" />
</td>
<td width="235" dir="ltr">
                        <asp:LinkButton ID="LinkButton1" runat="server" 
                         CommandArgument='<%# Eval("id") %>' CssClass="Link" 
         Text='<%# Eval("nickName") %>' CommandName="sendMess"></asp:LinkButton>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
                رکوردی موجود نیست
</EmptyDataTemplate>
</asp:GridView>

این هم کدی که در رویداد گریدویو گذاشتم:

کد:
protected void gvViewF_RowCommand(object sender, GridViewCommandEventArgs e)
 {
 if (e.CommandName == "sendMess")
 { LinkButton lbtn = (LinkButton)gvViewF.Rows[Convert.ToInt32(e.CommandArgument)].Cells[0].FindControl("LinkButton1");
Image imgUrl = (Image)gvViewF.Rows[Convert.ToInt32(e.CommandArgument)].Cells[0].FindControl("imgBtnF");
Response.Redirect("sendMess.aspx?a=" + lbtn.Text + "&imgU=" + imgUrl.ImageUrl); } 
}

در ضمن این توضیح رو هم بدم که فکر می کنم در قسمت e.CommandArgument مشکل دارم
چون وقتی CommandArgument رو id در جدول قرار می دم همون ترتیبی که خدمتتون در اول پست گفتم رخ می ده و مقادیر با هم همخونی نداره
مشکل اصلی تو تعریف این مسئله هست
و همچنین اضافه کنم که از RowIndex هم استفاده کردم ولی کلا ارور می گیره
از اساتید محترم خواهشمندم این مشکل که برام خیلی بزرگ شده رو حل کنن و منو راهنمایی کنن
regular_smile.gif
 
آخرین ویرایش:

M.U.T

Member
خیلی جسته گریخته توضیح دادید.ابتدا گفتید یک datatable دارید با یک سری مقادیر.ولی می خواید این مقادیر فیلتر بشه و در گرید نشون داده بشه.سپس گفتید که می خواید آدرس عکس و عنوان متن لینک باتن رو در متغیر بریزید که ریختید.و بعد گفتید command argument رو در id جدول قرار میدید(یعنی چی؟)همخونی نداشتن مقادیر یعنی چه؟از rowindex بابت چه چیزی استفاده کردید؟و در اخر می خواهید یک Datatable را فیلتر کنید؟با ستون یا فقط سطر ها؟یا اینکه می خواهید این مقادیر عکس و لینک را بیرون بکشید ولی نمی توانید؟یعنی دو متغیر شما پر نمی شود؟!!
 

jefri600

New Member
با سلام
وتشکر از توجهی که کردید
تمام موارد را کنار می گذاریم
فقط من می خوام با زدن دکمه ای در گرید ویو شماره اون سطر به دست بیاد و از مقادیر و کنترلهای اون سطر استفاده کنم (مشکل اصلی من همین است)
ببخشید اگر زیاده گویی کردم

در ضمن یک سئوال دیگه هم دارم که مربوط به Query string ها میشه
وقتی یک مقدار رو به یک صفحه دیگه میفرستم در آدرس بار صفحه نمایش داده می شه
چیکار کنم که مقادیر نا خوانا بشه مثل جستجو در گوگل
 
آخرین ویرایش:

M.U.T

Member
خیلی راحت می تونید از این روش استفاده کنید:
کد:
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]<[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]asp[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]:[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]TemplateField[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]<[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]ItemTemplate[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]<[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]asp[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]:[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]LinkButton[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#ff0000][SIZE=2][COLOR=#ff0000]ID[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]="LinkButton1"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#ff0000][SIZE=2][COLOR=#ff0000]runat[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]="server"[/COLOR][/SIZE][/COLOR][/SIZE]
[SIZE=2][COLOR=#ff0000][SIZE=2][COLOR=#ff0000]CommandArgument[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]='[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]<%# Eval("X") %>[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]'[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#ff0000][SIZE=2][COLOR=#ff0000]Text[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]='[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]<%# Eval("X") %>[/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]'[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#ff0000][SIZE=2][COLOR=#ff0000]CommandName[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]="X"></[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]asp[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]:[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]LinkButton[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]</[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]ItemTemplate[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]>[/COLOR][/SIZE]
[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]</[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]asp[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]:[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]TemplateField[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]>[/COLOR][/SIZE]
[/COLOR][/SIZE]

در کد :

کد:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
[SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]GridViewRow[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] gvr = ([/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]GridViewRow[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])(([/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]LinkButton[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])e.CommandSource).NamingContainer;[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] RowIndex = gvr.RowIndex; [/SIZE]
 
}

همچنین می تونید از این روش استفاده کنید:در این روش به command argument مستقیما شماره سطر را پاس می کنید:

کد:
<ItemTemplate> 
<asp:LinkButton ID="lnkbtnSubmit" runat="server" CommandName="Sample" Text='<%# Bind("X") %>' 
CommandArgument='<%# ((GridViewRow) Container).RowIndex %>' ></asp:LinkButton> 
</ItemTemplate>

و در کد :

کد:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
if (e.CommandName.Equals("Sample")) 
{ 
int RowIndex = Convert.ToInt32(e.CommandArgument).ToString(); 
} 
}

اما درباره Encode کردن url

رمز کردن:
کد:
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] str = [/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"~/NewFolder1/Default.aspx"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2][SIZE=2]Response.Redirect(str + [/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"?"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] + [/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]HttpUtility[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].UrlEncode([/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"ID=1&Code=445"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2],System.Text.[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]Encoding[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].UTF8));[/SIZE]
[/SIZE]

اما موقع خوندن از صفحه ای که به اون منتقل شدید برای دسترسی به مقادیر متغیر های پاس شده در querystring:

httputility در فضای نام System.Web قرار داره

کد:
[SIZE=2][SIZE=2]System.Collections.Specialized.[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]NameValueCollection[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] MyParameters = [/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]HttpUtility[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].ParseQueryString([/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]HttpUtility[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].UrlDecode(Request.QueryString.ToString[SIZE=2]
,System.Text.[/SIZE][SIZE=2][COLOR=#2b91af][SIZE=2][COLOR=#2b91af]Encoding[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].UTF8
[/SIZE]()));[/SIZE]
[/SIZE]
[SIZE=2][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] ID = MyParameters[[/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"ID"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]];[/SIZE]
[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Code = MyParameters[[/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]"Code"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]];[/SIZE]
[/SIZE]

این روش مقادیر متغیر های پاس شده رو رمز می کنه.مثلا اگه شما بعد از علامت سوال ID=1&Code=445 قرار داده باشدی چیزی به این شکل میشه:

ID%3d1%3bCode%3d4
 
آخرین ویرایش:

jefri600

New Member
با سلام و سپاس فراووووووووووووووووووووووووووووووووووووون
هرچی بگم کمه
یه دکمه تشکر واسه تو خیلی کمه ممنون
:rose::rose::rose::rose::rose::oops::wink::)
 

جدیدترین ارسال ها

بالا