PDA

View Full Version : کنترل اعتبارسنجی و خاصیت edit در گریدویو



fereshte22
دوشنبه 08 مرداد 1386, 18:35 عصر
سلام
من در فرم خود یک کنترل اعتبارسنجی RegularExpressionValidator قرارداده ام.همزمان در این فرم یک گرید ویو دارم و برای آپدیت سطرهای گریدویو خاصیت autogenerateeditbutton گریدویو را true کردم.حالا مشکل اینه که هر موقع میخواهم سطرها ی گریدویو را اپدیت کنم این کنترل اعتبار سنجی هم فعال میشود.
ایا راهی وجود دارد که از این مشکل حل شود.(مثل کنترل button معمولی که خاصیت causesvalidation اون را false میکنیم)
ممنون

Behrouz_Rad
دوشنبه 08 مرداد 1386, 20:29 عصر
در روال RowCreated کنترل GridView یک ارجا به دکمه به دست بیار و خاصیت ValidationGroup اش رو به یک نام دلخواه تنظیم کن.
همچنین می تونی خاصیت CausesValidation رو هم به همین روش False کنی اما من روش اول رو پیشنهاد می کنم.
تعیین وضعیت جاری ردیف رو قبل از اجرای دستورات فراموش نکن.
برای حالت اولیه:


If (e.Row.RowType = DataControlRowType.DataRow) Then

برای حالتی که در Edit Mode قرار داری:


If ((e.Row.RowType = DataControlRowType.DataRow) AndAlso (e.Row.RowState = DataControlRowState.Edit)) OrElse ((e.Row.RowType = DataControlRowType.DataRow) AndAlso (e.Row.RowState.ToString() = "Alternate, Edit")) Then


موفق باشید.

fereshte22
دوشنبه 08 مرداد 1386, 23:14 عصر
آقای راد میشه لطف کنید و در مورد کدهایی که قرار دادید بیشتر توضیح دهید.من دقیقا نمیدونم که باید چیکارکنم.با تشکر

Behrouz_Rad
سه شنبه 09 مرداد 1386, 09:51 صبح
واضح بود!
سعی میکنم ساده تر بگم.
اگر در جایی صحبت از "ارجا به کنترل" شنیدی، بدون منظور استفاده از متد FindControl هست.
زمانی که حالت AutoGenerateEditButton رو انتخاب میکنی، گزینه ای برای انتخاب نام این دکمه ها نداری.
در این حالت، ارجا باید By Index باشه.
در ابتدای کار (زمان Load صفحه) که عملیات Binding انجام میشه، همزمان روال RowCreated کنترل GridView نیز به ازای هر ردیف فراخوانی میشه.
در این روال میتونی بر روی کنترل های هر ردیف در زمان ایجاد اونها کنترل داشته باشی.
در ابتدا، ردیف های حاوی داده از نوع DataRow هستند و DataControlRowState اونها Normal هست.
همون طور که گفتی، اگر با یک دکمه ی معمولی سر و کار داشتی که در یک Container نبود، به راحتی میتونستی با تنظیم خاصیت CausesValidation اون، از فراخوانی روال Validate کنترل Validator جلوگیری کنی.
اما در حالتی که این دکمه ها در یک Container قرار دارن، میشه با ایجاد ارجا به اونها، به خواصشون دسترسی پیدا کرد و مثلا خاصیت CausesValidation اونها رو False کرد.
از روال RowCreated برای پیاده سازی این عمل بهره میبریم:


Dim editButton As Button
If (e.Row.RowType = DataControlRowType.DataRow) Then
editButton = DirectCast(e.Row.Cells(3).Controls(0), Button)
editButton.ValidationGroup = "Ye Chizi"
ElseIf ((e.Row.RowType = DataControlRowType.DataRow) AndAlso (e.Row.RowState = DataControlRowState.Edit)) OrElse ((e.Row.RowType = DataControlRowType.DataRow) AndAlso (e.Row.RowState.ToString() = "Alternate, Edit")) Then
editButton = DirectCast(e.Row.Cells(3).Controls(1), Button)
editButton.ValidationGroup = "Ye Chizi"
End If

همون طور که قبلا گفتم، چون دکمه های تو نام ندارند، باید از اندیس برای ارجا به اونها استفاده کنی.
در کد فوق میبینی که من فرض کردم که دکمه های ویرایش من در ستون "چهارم" قرار دارند و اندیس کنترل دکمه ی من "صفر" (در حالت نرمال) و "یک" (در حالت ویرایش) هست.
اندیس رو با سعی و خطا به دست بیار.
اگر کنترل دیگری نیز بود که باعث فراخوانی روال Validate میشد (مثل دکمه ی Cancel)، همانند روال فوق، اون رو خلع سلاح کن!

موفق باشید.

fereshte22
سه شنبه 09 مرداد 1386, 11:55 صبح
سلام
آقای راد عزیز توضیحات شما واضح و رسا بود .خیلی ممنون
فقط مشکل من در پیدا کردن اندیس است.هر اندیسی قرار میدهم خطای زیر را میگیرد.

Additional information: Specified argument was out of the range of valid values.
مثلا در طراحی زیر من ستون را صفر گذاشتم ولی اندیس را مشکل دارم.
این ازمودن مقادیر تا چه رنجی است؟
راهی نیست که با کدنویسی بشه این مقدار را پیدا کرد؟



<asp:GridViewID="AuthorsGridView"runat="server"AllowSorting="True"AutoGenerateColumns="False"
AutoGenerateEditButton="True"DataKeyNames="picid"DataSourceID="SqlDataSource1"
OnRowUpdating="AuthorsGridView_RowUpdating"ShowFooter="True"Width="744px">
<Columns>
<asp:TemplateFieldHeaderText="نام اگهی">
<EditItemTemplate>
<asp:TextBoxID="nameTextBox"runat="server"Text='<%#Eval("name")%>'Width="90"></asp:TextBox>
<br/>
</EditItemTemplate>
<ItemStyleVerticalAlign="Top"/>
<ItemTemplate>
<%#Eval("name")%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyleBackColor="LavenderBlush"Font-Names="Tahoma"Font-Size="Small"/>
<EditRowStyleBackColor="LavenderBlush"BorderColor="White"BorderStyle="Double"
ForeColor="Black"/>
<HeaderStyleBackColor="HotPink"/>
<AlternatingRowStyleBackColor="White"Font-Names="Tahoma"/>
</asp:GridView>

Behrouz_Rad
سه شنبه 09 مرداد 1386, 13:11 عصر
من پیشنهاد می کنم کدهای تاپیک اعمال متداول با GridView (http://barnamenevis.org/forum/showthread.php?t=50594) رو ببینی تا متوجه بشی که برای Edit به چه شکل باید عمل کنی.

موفق باشید.

fereshte22
سه شنبه 09 مرداد 1386, 14:13 عصر
آقای راد من با edit مشکلی ندارم.و از روش دیگری استفاده کرده ام.و مشکلم همون پیدا کردن اندیس است.اگر در این مورد من را راهنمایی کنید ممنون میشوم.

fereshte22
چهارشنبه 10 مرداد 1386, 10:36 صبح
من پیشنهاد می کنم کدهای تاپیک اعمال متداول با GridView (http://barnamenevis.org/forum/showthread.php?t=50594)رو ببینی تا متوجه بشی که برای Edit به چه شکل باید عمل کنی.

اقای راد یعنی روشی که شما فرمودید برای edit ای که من کار کردم جواب نمیدهد؟و با روش edit در کدهای تاپیک مذکور جواب میدهد؟
نمیدونم چرا هر اندیسی میگذارم قبول نمیکند؟؟؟

Behrouz_Rad
چهارشنبه 10 مرداد 1386, 12:39 عصر
متاسفم.
بیشتر از این نمیتونم کمکی کنم.
سعی و تلاش شما مطمئنا به شما کمک خواهد کرد.

موفق باشید.

fereshte22
پنج شنبه 11 مرداد 1386, 14:49 عصر
آقای راد مشکل با استفاده از commandfield حل شد..من قبلا از commandfield استفاده نمیکردم و به این صورت عمل میکردم که خاصیت autogenerateeditbutton را در گریدویو true میکردم به همین دلیل گزینه ای برای causesvalidation پیدا نمیکردم .ولی استفاده از command field مشکلم را به راحتی حل کرد.
حالا یه سوال دیگه که برای من پیش اومده این است که ایا میتونیم برای textbox هایی که موقع اپدیت داریم کنترل اعتبارسنجی قرار دهیم.؟
و طوری باشد که موقع edit این کنترل های اعتبارسنجی فعال شوند ولی کنترل های اعتبارسنجی مربوط به textbox های خارج از گریدویو غیر فعال شوند.؟
مثلا برای textbox زیر


<asp:TemplateFieldHeaderText="¢م§ں§ کéیک">
<EditItemTemplate>
<asp:TextBoxID="nclickTextBox"runat="server"Text='<%#Eval("nclick")%>'Width="90"></asp:TextBox>
<br/>
</EditItemTemplate>
<ItemStyleVerticalAlign="Top"/>
<ItemTemplate>
<%#Eval("nclick")%>
</ItemTemplate>
</asp:TemplateField>

Behrouz_Rad
پنج شنبه 11 مرداد 1386, 15:12 عصر
خوشحالم که موفق شدی. دیدی میتونی؟ ;)


ایا میتونیم برای textbox هایی که موقع اپدیت داریم کنترل اعتبارسنجی قرار دهیم.؟
و طوری باشد که موقع edit این کنترل های اعتبارسنجی فعال شوند ولی کنترل های اعتبارسنجی مربوط به textbox های خارج از گریدویو غیر فعال شوند.؟
نباید غیر فعال کنی!
ممکنه کاربر بخواد در عین حال که در مد ویرایش قرار داره، اطلاعاتی رو در TextBox ها وارد کنه و اونها رو ارسال کنه!
بهترین کار اینه که خاصیت ValidationGroup دکمه های خارج از GridView رو به یک نام دلخواه تنظیم کنی.

برای اضافه کردن یک Validator (مثلا CompareValidator) به مد ویرایش نیز به شکل ذیل عمل کن:


<EditItemTemplate>
<asp:TextBox ID="nclickTextBox" runat="server" Text='<%#Eval("nclick")%>'>
</asp:TextBox>
<asp:CompareValidator ID="CompareValidator1" runat="server" ControlToValidate="nclickTextBox" ErrorMessage="مقدار وارد شده باید بزرگتر مساوی صفر باشد" Operator="GreaterThanEqual" Type="Currency" ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>


موفق باشید.