PDA

View Full Version : کمک در مورد FindControl



merlin_vista
دوشنبه 12 آذر 1386, 13:22 عصر
آقا من برای اینکه اگه کاربر مدیر بود دکمه حذف در گرید ویو باشه و اگه کاربر بود نباشه اینا نوشتم :

if (Request.Cookies["UserAsan"].Values["Level"] == "User")
{
ImageButton img = (ImageButton)this.GridView1.FindControl("IMDEL");
img.Visible = false;
}

ولی این پیغام را میده :گریه:

Object reference not set to an instance of an object.

hamedgh
دوشنبه 12 آذر 1386, 13:49 عصر
کد گرید ویو ات را بزار شاید بیشتر بشه کمک کرد
در ضمن این خطا به خاطر کوکی ات است یا کنترلت کدام را نمی شناسد ؟؟؟؟
و اینکه این کد را کی اجرا می کنی ؟؟؟

merlin_vista
دوشنبه 12 آذر 1386, 14:09 عصر
باید بگم که نه مال کوکی نیست و مال کنترل هست !
این کد را در Pageload اجرا میکنم !

hamedgh
دوشنبه 12 آذر 1386, 16:11 عصر
مگر گرید ویو ات همین یک باتن را دارد که این طوری میخواهی مخفی اش کنی اگر در سطر های هایت است باید با یک حلقه foreach سطر به سطر بری و ان را مخفی کنی ااگر بیرون از گرید ویو است پس چرا موقع پیدا کردن ان از داخل گرید ویو صدا می زنی
اگر کد گرید ویو ات را می نوشتی شاید کد اصلاحیه هم برات می نوشتم !!!!!

merlin_vista
دوشنبه 12 آذر 1386, 17:01 عصر
نه دکمه داخل گرید ویو هست
این هم کد گرید قسمت ASP :

<asp:GridView id="GridView1" runat="server" CssClass="ft" Width="650px" PageSize="15" OnRowDeleting="GridView1_RowDeleting" OnPageIndexChanging="GridView1_PageIndexChanging" DataKeyNames="id" AllowPaging="True" HorizontalAlign="Center" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField HeaderText="نام ارسال کننده">
<ItemTemplate>
<asp:Label ID="lblName" runat="server" CssClass="ft" Text='<%# Eval("Regname") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="تاریخ ارسال">
<ItemTemplate>
<asp:Label ID="lblDate" runat="server" CssClass="ft" Text='<%# Eval("RegDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="ساعت ارسال">
<ItemTemplate>
<asp:Label ID="lbltime" runat="server" CssClass="ft" Text='<%# Eval("RegTim") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="ایمیل ">
<ItemTemplate>
<asp:HyperLink ID="HyperLink1" runat="server" CssClass="ft" NavigateUrl='<%# Eval("RegEmail") %>' Target="_blank">ایمیل</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="وب سایت">
<ItemTemplate>
<asp:HyperLink ID="HyperLink2" runat="server" CssClass="ft" NavigateUrl='<%# Eval("RegWeb") %>' Target="_blank">وب سایت</asp:HyperLink>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
&nbsp;
<asp:ImageButton ID="ImageButton1" runat="server" CausesValidation="False"
CommandName="Delete" ImageUrl="~/Images/icon/delete.gif" Text="Delete" ToolTip="حذف گزارش" />
<a href='<%# Eval("Link") %>' target="_blank"><img class="ft" src="Images/icon/edit.png" alt="ویرایش مطلب در سیستم موویل تایپ" /></a>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerSettings Position="TopAndBottom" />
<EmptyDataTemplate>
<asp:Label ID="Label1" runat="server" CssClass="ft" Font-Bold="True" ForeColor="#C04000"
Text="گزارشی از خرابی لینک ها وجود ندارد"></asp:Label>
</EmptyDataTemplate>
</asp:GridView>
قسمت C#

void gvbind()
{
SqlDataAdapter dat = new SqlDataAdapter("select * from link ORDER BY id DESC", con);
dat.SelectCommand.CommandType = CommandType.Text;
dat.Fill(dst, "link");
this.GridView1.DataSource = dst.Tables["link"].DefaultView;
this.GridView1.DataBind();
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string strDelete = "DELETE FROM link WHERE id = @id";
SqlCommand mySqlCmd = new SqlCommand(strDelete, con);
mySqlCmd.Parameters.AddWithValue("@id", GridView1.DataKeys[e.RowIndex].Value);
con.Open();
mySqlCmd.ExecuteNonQuery();
con.Close();
gvbind();
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.GridView1.PageIndex = e.NewPageIndex;
gvbind();
}

abolfazl585
دوشنبه 12 آذر 1386, 19:23 عصر
احتمالا مشکلت اینه که قبل از بایند کردن گریدویو، میخواهی که دکمه Delete را مخفی و یا نشان دهی در صورتی که هنوز هیچ Buttonی تشکیل نشده.
PageLoad Event قبل از PageIndexChanged ویا هر Event دیگری اجرا می شود.
اون کدهایی رو که میگفتی در PageLoad گذاشتی، ببرش تو PagePreRender.

نکته:
در هر صورت کار درستی نیست که در هر بار Load یک Process بصورت تکراری اجرا بشه، یک روش بهتر پیدا کن

mahdi_farhani
دوشنبه 12 آذر 1386, 21:42 عصر
دوست عزیز یا در رویداد Row_Create و یا در Data_Bound بنویس .
و احتیاج نداری FindControl کنی ، اگر فقط دکمه حذف داخلش هست کل ستون مخفی کن .

Gridview1.Columns[5].Visible=false;
------------- تو حاشیه اینو بگم ----------------------
در ضمن اگر هم بتونی که دسترسی به بانکتو کمتر بکنی خیلی بهتره .......
تو Paging شما میره دوباره از دیتابیس اطلاعات میخونی ، سعی کن اینکارو انجام ندی ، البته این نظر منه .میتوین یه متغییر سراسری بگیری یک بار از دیتابیس بخونی و بارهای بعدی فقط اطلاعات از اون Tbale که برای خودت ساختی استفاده کنی .

Exception
سه شنبه 13 آذر 1386, 10:47 صبح
در event RowDataBound گرید ویوت باید شرط مورد نظرتو چک کنی و visible butoon ات را true یا false کنی.فکر کنم کد زیر بدردت بخوره:


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{ if(هرچی میخوای چک کنی)
((Button)e.Row.FindControl("Button4")).Visible = false;
else
((Button)e.Row.FindControl("Button4")).Visible = true ;
}
}

hamedgh
سه شنبه 13 آذر 1386, 15:38 عصر
گفتم تاپیک جدید نفرستم تو همین جا سوالم را بپرسم
من یک دیتا لیست دارم در درونش چندتا چک باکس و یک باتن است
من می خواهم اگر در باتن کلیک شد
چک باکس های تیک خورده را پیدا کند
ولی با findcontrol جواب نمی ده
اگر کسی راه حلی هم در این مورد دار ه ممنون می شم


در ضمن جناب merlin
پیشنهاد exception بهترین است

Exception
چهارشنبه 14 آذر 1386, 18:04 عصر
من یک دیتا لیست دارم در درونش چندتا چک باکس و یک باتن است
من می خواهم اگر در باتن کلیک شد
چک باکس های تیک خورده را پیدا کند
ولی با findcontrol جواب نمی ده


گذاشتن یک butoon و چند checkBox در ItemTemplate یک dataList باعث ایجاد 1 butoon و چند checkBox برای هر Item میشه،حالا شما میخواهید بازدن هرکدوم ازین butoon ها checkBox های مربوط به همون Item چک بشند یا همه checkBox های تمام Item ها؟

hamedgh
چهارشنبه 14 آذر 1386, 20:20 عصر
از توجه دوستان ممنون رفتم سایت های بیگانه انجا به جواب رسیدم
نتیجه را می گذارم تا اگر روزی کسی مثل من .........




DataListItem item = btn.NamingContainer as DataListItem;
if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
{
Label mant = (Label)item.FindControl("txtmtn");
for (int i = 1; i < 11; i++)
{
CheckBox ch1 = (CheckBox)item.FindControl("chk" + i);
if (ch1 != null)
{
if (ch1.Checked)
{
javab[i - 1] = "true";
}
}
}{