PDA

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



Zabi42
چهارشنبه 09 تیر 1389, 17:44 عصر
با سلام خدمت دوستان

می خوام ببینم چطور میشه به کنترل هایی که درون Footer یک GridView گذاشتیم دسترسی داشته باشیم مثلا مقدارشو توی یک String بریزیم

Behrouz_Rad
چهارشنبه 09 تیر 1389, 18:34 عصر
GridView خصیصه ای با نام FooterRow داره که از طریق اون می تونی به Footer ارجاع و از طریق متد FindControl اش به کنترل مورد نظر دسترسی داشته باشی:


GridViewRow footerRow = GridView1.FooterRow;


موفق باشید.

Zabi42
چهارشنبه 09 تیر 1389, 18:45 عصر
توی یک تابعی که نوشتم قرار با استفاده از value یک DropDown که در GridView هست یک DropDown دیگه که اونم تو GridView هست پر بشه(به صورت آبشاری) برای بدست اوردن value دراپ اول کد زیر رو تو تابع نوشتم


GridViewRow row = GridView1.FooterRow;
string GroupId = ((DropDownList)(row.FindControl("Add_ddlGroupId"))).SelectedItem.Value;

وروی خط دوم error زیر رو میده

Object reference not set to an instance of an object.

Behrouz_Rad
چهارشنبه 09 تیر 1389, 20:55 عصر
یک Demo قرار بده.

Zabi42
پنج شنبه 10 تیر 1389, 17:19 عصر
نمی دونم منظورتون از Demo چیه؟؟
توابعی رو که نوشتم براتوم می زارم


<asp:TemplateField HeaderText=" ">
<ItemTemplate><%#Eval("GroupName") %></ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="Add_ddlGroup" runat="server" Font-Names="Tahoma" Font-Size="11px" DataTextField="GroupName" DataValueField="GroupId" DataSource='<%# FillddlGroup() %>' AutoPostBack="True">
</asp:DropDownList>
</FooterTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlGroup" runat="server" DataTextField="GroupName" DataValueField="GroupId" DataSource='<%# FillddlGroup() %>'>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText=" ">
<ItemTemplate><%#Eval("SubGroupName") %></ItemTemplate>
<FooterTemplate>
<asp:DropDownList ID="Add_ddlSubGroup" runat="server" Font-Names="Tahoma" Font-Size="11px" DataTextField="SubGroupName" ataValueField="SubGroupId" DataSource='<%# FillddlSubGroup() %>'>
</asp:DropDownList>
</FooterTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlSubGroup" runat="server" >
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>

و توابعمو به صورت زیر نوشتم که تابع FillddlGroup() درست کار میکنه ولی تابع FillSubGroup() که قرار DropdownList دوم رو با Value اولی پر کنه اون error پست بالا رو می ده


public DataSet FillddlGroup()
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["con"].ConnectionString))
{
SqlDataAdapter Da = null;
DataSet Ds = null;
SqlCommand Cmd = new SqlCommand("Groups_SelectAll", con);
Cmd.CommandType = CommandType.StoredProcedure;
con.Open();
Da = new SqlDataAdapter(Cmd);
Ds = new DataSet();
Da.Fill(Ds, "Groups");
con.Close();
return Ds;
}
}
public DataSet FillddlSubGroup()
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrin gs["con"].ConnectionString))
{
GridViewRow row = GridView1.FooterRow;
string GroupId = ((DropDownList)(row.FindControl("Add_ddlGroupId"))).SelectedItem.Value;
SqlDataAdapter Da = null;
DataSet Ds = null;
SqlCommand Cmd = new SqlCommand("SubGroup_SelectAll", con);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add("@i", SqlDbType.SmallInt).Value = Convert.ToInt32(GroupId);
con.Open();
Da = new SqlDataAdapter(Cmd);
Ds = new DataSet();
Da.Fill(Ds, "Groups");
con.Close();
return Ds;
}
}

Zabi42
پنج شنبه 10 تیر 1389, 17:26 عصر
البته فهمیدم مشکل از کجاست
درواقع تابع دومم باید در رویداد Add_ddlGroup SelectIndexChange دراپدانم نوشته بشه ولی با توجه به این که DropDown من تو GridView هست نمی دونم چطور باید بهش دسترسی داشت در حالت عادی با دو بار click روی دراپ به رویداد SelectIndexChange دسترسی پیدا میکنیم ولی تو GridView باید چی کار کرد؟؟؟؟؟؟؟؟؟؟؟؟؟؟

Behrouz_Rad
پنج شنبه 10 تیر 1389, 17:30 عصر
البته فهمیدم مشکل از کجاست
درواقع تابع دومم باید در رویداد Add_ddlGroup SelectIndexChange دراپدانم نوشته بشه ولی با توجه به این که DropDown من تو GridView هست نمی دونم چطور باید بهش دسترسی داشت در حالت عادی با دو بار click روی دراپ به رویداد SelectIndexChange دسترسی پیدا میکنیم ولی تو GridView باید چی کار کرد؟؟؟؟؟؟؟؟؟؟؟؟؟؟
دستی واسش بنویس... کدهای پروژه ی اعمال متداول با GridView بنده رو ببین:
http://barnamenevis.org/forum/showthread.php?t=50594

موفق باشید.

Zabi42
پنج شنبه 10 تیر 1389, 17:51 عصر
اتفاقا پروژه ی شما رو دیدم ولی متاسفانه VB هستش و من با C#‎ کد مینویسم

تو پروژه ی شما Event زیر برای پر کردن DropDown هاست؟؟


protectedvoid GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)

اون شرط رو که تو RowDataBound گذاشتید رو به C#‎ تبدیل کردم به این صورت شد


if (((e.Row.RowType == DataControlRowType.DataRow) & (e.Row.RowState == DataControlRowState.Edit)) | ((e.Row.RowType == DataControlRowType.DataRow) & (e.Row.RowState.ToString() == "Alternate, Edit")))

ولی انگار کار نمیکنه
وقسمت else اون هم error میگیره که از عملگر == نمیتونی استفاده کنی


elseif (e.Row.RowType==ListItemType.Footer)

که من اونو به شکل زیر نوشتم Error نگرفت اما مثل شرط بالا عمل نکرد و کدهای توی اون اجرا نشد


elseif (e.Row.RowType.Equals(ListItemType.Footer))

Behrouz_Rad
پنج شنبه 10 تیر 1389, 18:00 عصر
نسخه ی آخر بر اساس #C هست.
http://barnamenevis.org/forum/showpost.php?p=692821&postcount=111

موفق باشید.

Zabi42
جمعه 11 تیر 1389, 22:42 عصر
اقای راد مرسی از پروژه ی خوبتون خیلی کمک کرد بهم حالا یه مشکلی هست اینکه تابع doInsert کار نمی کنه یعنی CommandName هر دکمه ای رو Insert می زارم اون تابع رو اجرا نمی کنه وقتی صفحه هم load می شه اون تابع رو رد می کنه
چیزیو باید تو گیریوم فعال کنم؟؟؟؟؟؟؟؟؟؟

Behrouz_Rad
جمعه 11 تیر 1389, 23:07 عصر
آیا مقدار خصیصه ی OnRowCommand رو در فایل aspx برابر با doInsert قرار دادی؟

Zabi42
شنبه 12 تیر 1389, 00:19 صبح
مرسی از پاسختون مشکل همین بود

Zabi42
شنبه 12 تیر 1389, 03:30 صبح
ضمن تشکر از اقای راد و پوزش بابت این همه سوال
Procedure قسمت Delete رو چطوری باید بنویسم تا بتونم چند تا سطر رو پاک کنم؟؟؟ تو نسخه ی اول برنامتون بدون Procedure نوشتید و تو نسخه ی 7 چون برنامه رو سه لایه نوشتید زیاد متوجه نشدم که چطوره
یعنی نفهمیدم کد زیر که تو شرط Procedure هست چیه؟؟


SELECT nstr FROM dbo.iter_charlist_to_tbl

و از اون Error می گرفت

چطور می تونم Delete رو با Procedur پیاده کنم؟؟؟

Behrouz_Rad
شنبه 12 تیر 1389, 07:53 صبح
iter_charlist_to_tbl یک User Defind Function هست. در SQL Server در زیر شاخه ی Functions می تونی ببینیش. اون رو به دیتابیست اضافه کن. من برای اینکه مجبور نباشم دستور Delete رو به ازای هر رکورد انتخابی فراخوانی کنم و فقط یک بار اون رو فراخوانی کنم، سعی در استفاده از عملگر IN در SQL Server کردم اما این عملگر مقدار رشته ای نمی پذیره و باید مقادیر حاصل از یک Select بهش پاس داده بشه. در نتیجه از تابع iter_charlist_to_tbl استفاده کردم که رشته ای رو که مقادیرش با استفاده از کاراکتری که بهش معرفی کردی جدا شدن رو می پذیره و یک Table برگشت میده که در هر ردیف از ستونی که برگشت میده، یک مقدار از رشته وجود داره. در دستور IN از اون Table یک Select گرفتم و ازش استفاده کردم.

موفق باشید.

Zabi42
شنبه 12 تیر 1389, 22:51 عصر
چون با Function کار نکردم زیاد متوجه نشدم چی کار می کنه ولی در کل از روش دیگه ای استفاده کردم و مشکل حل شد
یه سوال داشتم
چطور می تونم عرض ستون های GridView رو تعیین کنم که با توجه به بزرگ بودن متن کش نیاد و اندازش همون قدر که تعیین کردیم باشه؟؟؟؟؟

Behrouz_Rad
شنبه 12 تیر 1389, 22:57 عصر
برای سوال جدیدتون تاپیک جدیدی ایجاد کنید.

موفق باشید.