PDA

View Full Version : عدم تکرار یک دکمه در تمام سطر های گرید ویو



SAMARE
پنج شنبه 21 آبان 1388, 14:03 عصر
سلام دوستان گرامی
من میخوام یک گرید ویو طراحی کنم که دکمه تعریف شده برای آن در سطری خاص (با شرطی خاص) غیر فعال یا visible آن false بشه
ممنون میشم کمکم کنید!!!

Hossein Bazyan
پنج شنبه 21 آبان 1388, 15:06 عصر
سلام دوستان گرامی
من میخوام یک گرید ویو طراحی کنم که دکمه تعریف شده برای آن در سطری خاص (با شرطی خاص) غیر فعال یا visible آن false بشه
ممنون میشم کمکم کنید!!!
سلام
شما در رویداد RowDataBound گرید ویو باید شرط را کنترل کنید
به ازای ایجاد هر خط از گریدویو یکبار فراخوانی میشه
به مثال زیر توجه کن



Protected Sub dgvWeek1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles dgvWeek1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim cmd_GO As Button = DirectCast(e.Row.FindControl("cmdGo"), Button)
If a=0 Then cmd_GO.Enabled = True Else cmd_GO.Enabled = Flase
End If
End Sub


من یک دکمه بنام cmdGo در گریویو ساختم حال با ایجاد هر خط از گریدویو شیء بنام cmd_GO از نوع Button میسازم که در گیرد آنرا بنام cmdGo جستجو میکند اگر پیدا کرد که پیدا میکنه برای من کلیدی بنام cmd_GO میسازه حال شرطم را کنترل و فعال و غیر فعال کردن کلید را منوط به این شرط میکنم

SAMARE
شنبه 23 آبان 1388, 09:04 صبح
ممنون از پاسخ تون
مشکل دیگه من اینه که باید در شرط گفته کلید اصلی هر سطر رو با عدد 3 مقایسه کنم ولی نمیدونم چرا کد زیر جواب نمیده
If Gridview1.SelectedDataKey.Value = 3 Then

وerror زیر رو میده :
Object reference not set to an instance of an object.
کسی نمیدونه چجوری باید id هر سطر رو بدست بیارم؟؟؟

Hossein Bazyan
شنبه 23 آبان 1388, 11:41 صبح
ممنون از پاسخ تون
مشکل دیگه من اینه که باید در شرط گفته کلید اصلی هر سطر رو با عدد 3 مقایسه کنم ولی نمیدونم چرا کد زیر جواب نمیده
If Gridview1.SelectedDataKey.Value = 3 Then

وerror زیر رو میده :
Object reference not set to an instance of an object.
کسی نمیدونه چجوری باید id هر سطر رو بدست بیارم؟؟؟


سلام
همه دستورات رو داخل Try بنویس چون دو بار این رویداد فراخوانی میشه بار اول که خالیه و چون هیچ عضوی نداره و پیغام خطا میده و بار دوم خطا نمیده . به همین دلیل دستورات را داخل try بنویس

SAMARE
شنبه 23 آبان 1388, 12:15 عصر
من در رویداد page_load نمایش گرید ویو رو فراخوانی میکنم
کد مورد نظر رو هم داخل try نوشتم ولی در هنگام لود شدن صفحه متاسفانه باز شرط من نادیده گرفته میشه
کد من بصورت زیر هست :


Try
If e.Row.RowType = DataControlRowType.DataRow Then
Dim Btn_Edit As Button = DirectCast(e.Row.FindControl("btnEdit"), Button)
If Gridview1.SelectedDataKey.Value = 3 Then
Btn_Edit.Visible = False
Else
Btn_Edit.Visible = True
EndIf
EndIf
Catch ex As Exception
EndTry

Hossein Bazyan
شنبه 23 آبان 1388, 19:59 عصر
سلام
این کد را نمیتوان در فرو لود نوشت باید در RowDataBound گریدویو بنویسی
چون در فرم لود e یه چیز دیگه ای است
اگه لازم دیدی کدت رو بذار تا بیشتر کنترل کنیم

SAMARE
یک شنبه 24 آبان 1388, 08:16 صبح
دوست عزیز من کد بالا رو در رویداد RowDataBound نوشتم بصورت زیر :



ProtectedSub Gridview1_RowDataBound(ByVal sender AsObject, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
Try
If e.Row.RowType = DataControlRowType.DataRow Then
Dim Btn_Edit As Button = DirectCast(e.Row.FindControl("btnEdit"), Button)
Dim chk As CheckBox = DirectCast(e.Row.FindControl("ChkRemove"), CheckBox)
If Gridview1.SelectedDataKey.Value = 3 Then
Btn_Edit.Visible = False
chk.Visible = False
Else
Btn_Edit.Visible = True
chk.Visible = True
EndIf
EndIf
Catch ex As Exception

EndTry

EndSub


و در رویداد page-load گرید ویو رو بایند میکنم
منظورم اینه که اینکه کجا گریدویو بایند بشه مهمه!؟؟؟

Hossein Bazyan
یک شنبه 24 آبان 1388, 22:34 عصر
سلام
میشه کدهات رو آپلود کنی ؟

SAMARE
دوشنبه 25 آبان 1388, 10:02 صبح
ببخشید نمیتونم آپلود کنم!!!
به نظرتون اشکال کار ممکنه از کجا باشه؟؟؟
کد مشکلی نداره؟؟؟

Hossein Bazyan
دوشنبه 25 آبان 1388, 10:46 صبح
ببخشید نمیتونم آپلود کنم!!!
به نظرتون اشکال کار ممکنه از کجا باشه؟؟؟
کد مشکلی نداره؟؟؟
سلام
کدی رو که من نوشتم از خود پروژم درآوردم ( این یعنی برای من کار میکنه ) و تا برنامه شما رو نبینم نمتوانم نظر بدم.
من برنامتون را نمیخوام فقط اون صحفه ای که کد رو در اون قرار دادی رو میخوام نگاه کنم. در ضمن اگه نمیتوانی آپلود کنی برام میل کن تا جوابش رو هم برات میل کنم

mehdi.mousavi
دوشنبه 25 آبان 1388, 11:00 صبح
سلام همه دستورات رو داخل Try بنویس چون دو بار این رویداد فراخوانی میشه بار اول که خالیه و چون هیچ عضوی نداره و پیغام خطا میده و بار دوم خطا نمیده . به همین دلیل دستورات را داخل try بنویس

وای خدای من! این دیگه چه توصیه ای هستش؟؟؟ اولا، برای حل یک مشکل، باید مشکل رو حل کرد، نه با اینکارا اونو دور زد! دوما، میدونید Exception چیه و چقدر در نرم افزار هزینه بر هستش؟ شما هر وقت به مشکلی بخورید، کدتون رو تو try catch میندازید و تمام؟؟؟ این کار مطلقا صحیح نیست!

mehdi.mousavi
دوشنبه 25 آبان 1388, 11:05 صبح
ممنون از پاسخ تون
مشکل دیگه من اینه که باید در شرط گفته کلید اصلی هر سطر رو با عدد 3 مقایسه کنم ولی نمیدونم چرا کد زیر جواب نمیده
If Gridview1.SelectedDataKey.Value = 3 Then

وerror زیر رو میده :
Object reference not set to an instance of an object.
کسی نمیدونه چجوری باید id هر سطر رو بدست بیارم؟؟؟


سلام.
شما دنبال Row سوم هستید یا Row ای رو میخواهید که DataKey اش سه هست؟ بنظرم در هر دو حالت، دارید کار عجیبی انجام میدید که اصلا چنین نیازی دارید. Row با ID سه، چه ویژگی خاصی داره که ...؟ لطفا اصل ماجرا رو توضیح بدید، تا یه پاسخ خوب بهتون بدم.

پیام فوق رو هم به این دلیل میگیرید که SelectedDataKey هنگام اجرا، null هستش و شما سپس value رو دارید آدرس می کنید و ...

موفق باشید.

SAMARE
دوشنبه 25 آبان 1388, 11:13 صبح
سلام دوست عزیز
من یک جدول در دیتابیس دارم که گروه های خبری رو درآن ذخیره کردم و هر گروه خبری دارای یک آی دی مجزا هست
یکی از این گروه های خبری "گروه خبری بخش عمومی " هست که آی دی اون برابر 3 هست
حالا در بخش مدیریت گروههای خبری من همه اونها رو در یک گرید ویو نمایش میدم . با قابلیت حذف و ویرایش!
که در هر سطر گریدویو برای ویرایش یک دکمه و برای حذف یک چک باکس قرار دادم
منتها سطر مربوط به "گروه خبری بخش عمومی " نباید قابلیت حذف داشته باشه و من میخوام کدی بنویسم که در هنگام بایند شدن گریدویو چک باکس مربوط به سطر "گروه خبری عمومی" غیرفعال بشه یا اینه اصلا نشون داده نشه!!!
این مشکل منه!!!

Hossein Bazyan
دوشنبه 25 آبان 1388, 11:37 صبح
سلام
برنامه رو با توجه به شرط دوستمون اصلاح کردم

دیتابیس رو برای تست mdb با 2 جدول ساختم و در ازای پر کردن هر سطر شرط زوج و فرد بودن یک متغییر بررسی شده و ب توجه به آن Button مخفی یا نمایش داده میشود.

Hossein Bazyan
دوشنبه 25 آبان 1388, 11:44 صبح
وای خدای من! این دیگه چه توصیه ای هستش؟؟؟ اولا، برای حل یک مشکل، باید مشکل رو حل کرد، نه با اینکارا اونو دور زد! دوما، میدونید Exception چیه و چقدر در نرم افزار هزینه بر هستش؟ شما هر وقت به مشکلی بخورید، کدتون رو تو try catch میندازید و تمام؟؟؟ این کار مطلقا صحیح نیست!
سلام
دوست عزیز نظر شما کاملا محترم و بجاست
اما در جاهایی که هیچ راهی وجود نداره به این میگن آخرین راه حل . هنگام پر کردن گرید ویو اگر گرید خالی باشه و بخوای از آن چیزی بخوانی ( اینجا برای کنترل آن ) حتما پیغام خطا میده و در سطرهای بعدی چون حداقل یک سطر وجود داره خطا نمیده . با این حساب شما خطا رو اگر با try کنترل نمیکنی با چی کنترل میکنی؟
ساختار و ذات وجودی try برای کنترل خطاست حالا چه هزینه بر باشه ( زمانبر ) چه نباشه و این بهتر از اینه که سیستم خودش برنامه رو قطع و خطا بگیره که هزینه بر تر میشود.
در ضمن اگر شما کنترل خطا نکنید و خطا رخ بده یه پله بالاتر پیغام خطا صادر شده و تمامی دستوراتی را که در تابع یا سابروتین مورد نظر بوده را اجرا نمیکند.

mehdi.mousavi
دوشنبه 25 آبان 1388, 13:46 عصر
سلام دوست عزیز
من یک جدول در دیتابیس دارم که گروه های خبری رو درآن ذخیره کردم و هر گروه خبری دارای یک آی دی مجزا هست یکی از این گروه های خبری "گروه خبری بخش عمومی " هست که آی دی اون برابر 3 هست حالا در بخش مدیریت گروههای خبری من همه اونها رو در یک گرید ویو نمایش میدم . با قابلیت حذف و ویرایش! که در هر سطر گریدویو برای ویرایش یک دکمه و برای حذف یک چک باکس قرار دادم منتها سطر مربوط به "گروه خبری بخش عمومی " نباید قابلیت حذف داشته باشه و من میخوام کدی بنویسم که در هنگام بایند شدن گریدویو چک باکس مربوط به سطر "گروه خبری عمومی" غیرفعال بشه یا اینه اصلا نشون داده نشه!!!
این مشکل منه!!!

سلام.
نخست برای اینکار شما باید اون Row با ID سه رو در بانک مشخص کنید! شما نباید عدد 3 رو در برنامه Hard Code کنید. پس من فرض رو میذارم به اینکه شما اینکارو انجام خواهید داد. وقتی اینکارو انجام دادید، میتونید بصورت Declarative تو فایل ASPX براحتی Visible/Invisible بودن CheckBox مربوطه رو تعیین کنید:

Visible='<%#((WhateverObject)Container.DataItem).IsFifthRow

تو این کد فرض بر اینه که DataItem یک Object از نوع WhateverObject هستش (که بیانگر یک Row از اون جدول هست) و IsFifthRow هم Flag ای هستش که سمت سرور برای Row سوم، set شده.

اما فرض کنیم که اینکارو نخواهید انجام بدید، و مایل باشید تا با استفاده از RowDataBound اینکارو انجام بدید. در چنین شرایطی، میتونید اینطور عمل کنید:


protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
GridViewRow row = e.Row;
if (row.RowType == DataControlRowType.DataRow)
{
int id = (int)this.gridView.DataKeys[row.RowIndex]["Id"];
if (id == 3)
{
CheckBox chk = (CheckBox)row.FindControl("checkBox");
chk.Enabled = false;
}
}
}


این کد چیکار میکنه؟ ابتدا نگاه میکنه ببینه آیا Row ای که در حال نمایش هست، از نوع DataRow هست یا خیر. چون ممکنه Row مزبور Header، Footer یا ... باشه که ما با اونها کاری نداریم. بعد که از DataRow بودنش مطمئن شد، میگه از Row مزبور، DataKey ای که اسمش Id هست رو بگیر و اونو به integer کست کن. به این ترتیب ID اون ردیفی که قراره الان نشون داده بشه، بدست میاد. بعدش هم با عدد 3 مقایسه میکنم، ببینم یکی هست یا نه. اگر بود، CheckBox ای رو که اسمی checkBox هست و پیدا می کنم و اونو disable میکنم.

حالا دیگه نمیدونم Exception و ... که دوستان گفتند چی هستش و کجا نیاز به Exception Handling داره. ضمن اینکه، کدی که ایشون ارسال کردن، از بیخ و بن ایراد داره. بعنوان مثال، توی RowDataBound اومدن Query میکنن!!! این رخداد برای هر Row ای که قرار نشون داده بشه، یکبار Call میشه. وقتی شما تو هر Row یکبار بخواهید از SQL Server کوئری کنید، SQL Server رو بزانو در میارید...........

موفق باشید.

mehdi.mousavi
دوشنبه 25 آبان 1388, 13:52 عصر
سلام
دوست عزیز نظر شما کاملا محترم و بجاست اما در جاهایی که هیچ راهی وجود نداره به این میگن آخرین راه حل . هنگام پر کردن گرید ویو اگر گرید خالی باشه و بخوای از آن چیزی بخوانی ( اینجا برای کنترل آن ) حتما پیغام خطا میده و در سطرهای بعدی چون حداقل یک سطر وجود داره خطا نمیده . با این حساب شما خطا رو اگر با try کنترل نمیکنی با چی کنترل میکنی؟
ساختار و ذات وجودی try برای کنترل خطاست حالا چه هزینه بر باشه ( زمانبر ) چه نباشه و این بهتر از اینه که سیستم خودش برنامه رو قطع و خطا بگیره که هزینه بر تر میشود.
در ضمن اگر شما کنترل خطا نکنید و خطا رخ بده یه پله بالاتر پیغام خطا صادر شده و تمامی دستوراتی را که در تابع یا سابروتین مورد نظر بوده را اجرا نمیکند.

سلام.
ببینید. وقتی شما میدونید GridView خالی هستش، برای چی سعی میکنید Field ای از اونو بخونید که بخواد Exception تولید بشه؟ کدی هم که نوشتید رو من دیدم، متاسفانه پر از ایراده که در حال حاضر فرصت توضیح دادنش رو ندارم. اگر فرصت کردم، مو به مو بهتون توضیح میده که چه مشکلاتی در کدی که نوشتید وجود داره. البته به عمده ترین مشکلش در پست قبلی اشاره کردم. موفق باشید.

SAMARE
دوشنبه 25 آبان 1388, 14:03 عصر
دوستان عزیز بینهایت از لطفتون ممنونم
من جوابم رو گرفتم!

milad.biroonvand
دوشنبه 25 آبان 1388, 14:12 عصر
بعد از این همه جواب دادن دوستان خیلی کردی جوابت رو فهمیدی و تازه داخل این سایت برنامه نویس شما اول باید یه جستجو بزنی اگه جوابتو پیدا نکردی تاپیک بزنی.
با تشکر دوست عزیز.

mehdi.mousavi
دوشنبه 25 آبان 1388, 15:20 عصر
دوستان عزیز بینهایت از لطفتون ممنونم من جوابم رو گرفتم!

خدا رو شکر، لا اقل اینهمه تایپ کردن هدر نرفت!

SAMARE
سه شنبه 26 آبان 1388, 00:40 صبح
بعد از این همه جواب دادن دوستان خیلی کردی جوابت رو فهمیدی و تازه داخل این سایت برنامه نویس شما اول باید یه جستجو بزنی اگه جوابتو پیدا نکردی تاپیک بزنی.
با تشکر دوست عزیز.
جناب آقاي بيرون وند از اخطار شما بينهايت سپاسگذارم ولي لازمه كه به نكات زير توجه كنيد تا انشاله تذكرتون رو بار ديگر در جايي مطرح كنيد كه بجا باشه ...

1.با توجه به جمله اي پررنگ شده به نظر من اينگونه صحبت كردن در شان اعضاي اين سايت علمي كه همگي جز افراد تحصيلكرده هستند نيست!!!

2. اين تالار مثل همه تالارهاي ديگه مديران كارآمدي داره كه به موقع و در صورت تكراري بودن تاپيك اقدام به حذف اون ميكنند كه من هر چي نگاه ميكنم شما رو در ليست مديران نميبينم(شايد مدير مخفي با لباس شخصي هستيد!!!:متفکر:)

3. كافيه كه شما نگاهي به تعداد مشاهدات اين تاپيك بندازيد در آنصورت بدون هيچ تلاش ذهني خواهي فهميد كه يك تاپيك تكراري اينهمه بازديد كننده نداره!!!

4. در پايان من هم براي شما آرزوي موفقيت دارم و اميدوارم در آينده به آرزوتون( مدير شدن) برسيد !!!