PDA

View Full Version : چرا RowCommand؟



A.Yousefi
جمعه 28 بهمن 1390, 20:30 عصر
سلام
به آیتم هایی که تو TemplateField گریدوید اضافه میشن نمیشه تو code behind دسترسی داشت و باید از متد FindControl استفاده کرد،اما چرا باید از متود RowCommand گریدویو استفاده کرد؟
بینید من یه دکمه تو فوتر گریدم انداختم و میخوام با انتخاب رکوردهای انتخابی توسط کاربر و کلیک روی اون آیتمهای انتخابی توسط کاربر حذف شن،برای اینکه بتونم برای این باتن کد بنویسم جایی خوندم که باید CommanName اونو برابر یه مقداری قرار بدم و تو RowCoomand گریدم بگم اگه e.CommandName برابر با اون مقدار بود اون موقع کاری که میخوامو انجام بده.
خب این امکان وجود داره که تو رویداد کلیک همون باتن کدهای مورد نظرمو بنویسم،منم همین کارو کردم و درستم داره کار میکنه،اما نمیفهمم که لزوم استفاده از RowCommand چی بود و چرا میگن باید از Rowcommand استفاده کرد و به CommandName مقدار داد بعد تو rowCommand اونو مقایسه کرد و لقمرو دور دهن گردوند در حالیکه میشه مستقیما تو رویداد کلیک همون باتن کدهای مورد نظر رو نوشت؟:متفکر:

raziee
جمعه 28 بهمن 1390, 20:47 عصر
با سلام.
شما دارید از یک شیء به نام GridView استفاده میکنید.
هر شیء دارای خصوصیات و رفاتر های خاص خودش هست. با استفاده از این رفتار ها میتونید اون شیء رو کنترل کنید.
رویداد RowCommand زمانی اتفاق میافته که یکی از اشیائ داخل GridView که دارای رویداد کلیک هست مثل Button,... کلیک شدن عملیات خاصی که مد نظر شما هست اتفاق بیافته.
استفاده از CommandName برای تشخیص کنترل انتخاب شده هست. مثلا اگر شما 2 Button به منظور حذف و ویرایش داشته باشید میتونید بوسیله CommandName اون رو تشخصی داد و اگر نیاز به ارسال آرگومان خاصی هم بود توسط CommandArgument، آرگومان مربوطه مثلا Id رکورد رو بدست آورد.

A.Yousefi
جمعه 28 بهمن 1390, 21:02 عصر
سلام جناب رضایی
خب پس یعنی فقط وقتیکه با CommandArgument ش کار داریم باید از RowCommand استفاده کنیم دیگه؟
یعنی CommandName در کنار CommandArgument باید استفاده شه؟
منی که به CommandArgumentش نیاز ندارم پس از همون رویداد کلیک باتن استفاده کنم بهتره نه؟
آخه میخوام یه مقداریو از SelectedValue کمبوباکسی که انتخاب میشه به دست بیارم که امکان استفاده از commandArg رو ندارم و باید با Findcontrol اون مقدار رو پیدا کنم.

raziee
جمعه 28 بهمن 1390, 21:49 عصر
باسلام.
شما نمیتونید به رویداد کلیک یک Button که در گرید هست دسترسی پیدا کنید.
کد هاتون رو قرار بدید

A.Yousefi
جمعه 28 بهمن 1390, 22:59 عصر
باسلام.
شما نمیتونید به رویداد کلیک یک Button که در گرید هست دسترسی پیدا کنید.
کد هاتون رو قرار بدید
والا من روش دوبار کلیک کردم یه رویداد ایجاد کرد و توش کدامو نوشتم الانم داره کار مکینه:



protected








void btnDelete_Click(object sender, EventArgs e)

{





foreach (GridViewRow row in grvProduct.Rows)

{





CheckBox checkbox = (CheckBox)row.FindControl("chbDelete");





if (checkbox.Checked)

{

sdsProduct.DeleteParameters[



"ID"].DefaultValue = grvProduct.DataKeys[row.RowIndex].Values["ID"].ToString();

sdsProduct.Delete();

}

}

}





<


FooterTemplate>



<asp:Button ID="btnDelete" runat="server"



style="height: 26px" Text="Delete" onclick="btnDelete_Click" />



</FooterTemplate>

این باتن رو توی فوتر گرید ویو و تو یه TemplateField هم قرار دادم،اگه نمیشه دسترسی پیدا کرد پس من چجوری بهش دسترسی پیدا کردم؟!!

raziee
شنبه 29 بهمن 1390, 01:03 صبح
با سلام.

این باتن رو توی فوتر گرید ویو و تو یه TemplateField هم قرار دادم،اگه نمیشه دسترسی پیدا کرد پس من چجوری بهش دسترسی پیدا کردم؟!!
در این حالت بله حق با شماست.
من فکر میکرم که Button رو در هر سطر دارید.

A.Yousefi
شنبه 29 بهمن 1390, 19:21 عصر
با سلام.

در این حالت بله حق با شماست.
من فکر میکرم که Button رو در هر سطر دارید.
ممنون از جوابتون
ولی والا وقتی من باتنو تو Item Template هم میذارم بازم میتونم برای رویداد کلیکش کد بنویسم با دوبار کلیک کردن روی اون!
با این اوصاف بهتره با امکاناتی که کامپیوتر من در اختیارم میذاره از RowCommand استفاده نکنم دیگه؟

fakhravari
شنبه 29 بهمن 1390, 19:25 عصر
شما در گرید باید از row استفاده کنید . استاندارد ماکروسوفت خراب نکنید .
رویداد کلیک را از صفحه پاک کنید و از خاصیت ارگمان نام استفاده کنید.

A.Yousefi
شنبه 29 بهمن 1390, 19:26 عصر
شما در گرید باید از row استفاده کنید . استاندارد ماکروسوفت خراب نکنید .
رویداد کلیک را از صفحه پاک کنید و از خاصیت ارگمان نام استفاده کنید.
استاندارد مایکروسافت اینه که از Row استفاده کنیم؟
میشه یه لینک در این مورد بدین؟
پس رویداد کلیک رو برای چی تعبیه کردن؟

fakhravari
شنبه 29 بهمن 1390, 20:42 عصر
عزیز دل برادر من که نمیگم اشتباه دستور کلیک . شما میگید روی سیستم من درست کار میکنه . خوب اشتباه دیگه.
در تمپلت گرید شما یه textbox میزارید و یا هر چیز دیگه شما در هر row سطر جدول از همان کنترل یه کپی دارید که با مشخصه ارگمان از هم جدا میشوند.
شما دستور کلیک حذف کنید و با ارگمان نام کار کنید.

A.Yousefi
شنبه 29 بهمن 1390, 21:29 عصر
عزیز دل برادر من که نمیگم اشتباه دستور کلیک . شما میگید روی سیستم من درست کار میکنه . خوب اشتباه دیگه.
در تمپلت گرید شما یه textbox میزارید و یا هر چیز دیگه شما در هر row سطر جدول از همان کنترل یه کپی دارید که با مشخصه ارگمان از هم جدا میشوند.
شما دستور کلیک حذف کنید و با ارگمان نام کار کنید.
یعنی اون کدی من نوشتم بالا رو سیستم شما کار نمیکنه؟
منم که نگفتم اصلا نباید از RowCommand استفاده کرد،میگم وقتی نمیخوام تو این مورد از commandArgument استفاده کنم چه لزومی داره الکی برم از RowCommand و CommandName و مقایسه و ... استفاده کنم؟وقتی میشه از رویداد کلیک استفاده کرد.

fakhravari
شنبه 29 بهمن 1390, 22:48 عصر
http://barnamenevis.org/showthread.php?319991-%D8%AB%D8%A8%D8%AA-%D8%AA%D9%85%D8%A7%D9%85%DB%8C-%D9%86%D9%85%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7-%DB%8C%DA%A9-%DA%A9%D9%84%DB%8C%DA%A9&highlight=%D8%AB%D8%A8%D8%AA+%D9%86%D9%85%D8%B1%D8 %A7%D8%AA

A.Yousefi
شنبه 29 بهمن 1390, 23:03 عصر
http://barnamenevis.org/showthread.php?319991-%D8%AB%D8%A8%D8%AA-%D8%AA%D9%85%D8%A7%D9%85%DB%8C-%D9%86%D9%85%D8%B1%D8%A7%D8%AA-%D8%A8%D8%A7-%DB%8C%DA%A9-%DA%A9%D9%84%DB%8C%DA%A9&highlight=%D8%AB%D8%A8%D8%AA+%D9%86%D9%85%D8%B1%D8 %A7%D8%AA
توی اون تاپیک alonemm باتنو انداخته بیرون گرید،ولی توی گریدم میشه انداخت و همون کد رو نوشت.

fakhravari
شنبه 29 بهمن 1390, 23:44 عصر
خوب چون یه باتن مشکل پیش نمیاد.
ولی اصولیش ارگمان نام

A.Yousefi
شنبه 29 بهمن 1390, 23:49 عصر
خوب چون یه باتن مشکل پیش نمیاد.
ولی اصولیش ارگمان نام
یعنی چی یه باتن مشکل پیش نمیاد؟!
من میگم نیازی به CommandArg ندارم،یعنی اونکاری که من میخوام بکنم با CommandArg قابل پیاده سازی نیست،اونوقت شما میگین اصولیش CommandArg هست؟
همه حرف من اینه که منی که با CommandArg کار ندارم چرا باید از RowCommand و CommandName و مقایسه و ... استفاده کنم وقتی میشه تو رویداد کلیک باتن کد نوشت؟
چرا اصولی نیست؟

fakhravari
یک شنبه 30 بهمن 1390, 00:19 صبح
بله به اون روش میشه.

protected void Button3_Click(object sender, EventArgs e)
{
try
{
foreach (GridViewRow row in GridView1.Rows)
{
Label txtid = row.FindControl("Label3") as Label;
CheckBox ch = row.FindControl("CheckBox1") as CheckBox;

if (txtid != null && ch.Checked==true)
{
int valueid = Int32.Parse(txtid.Text);

Del(valueid);
}
}

lasteror = "اطلاعات حذف شد";
Response.Write(lasteror);
}
catch
{
lasteror = "اشکال در حذف اطلاعات";
Response.Write(lasteror);
}
}
if (e.CommandName == "Del")
{
Button3_Click(null, null);
}
-----------
ولی اگر شما بیشتر 1 دکمه داشته باشید برای مثال
<asp:Button ID="Button4" runat="server" Text="Del" CommandArgument='<%# Eval("id") %>' CommandName="Del"/>
<asp:Button ID="Button5" runat="server" Text="Edit" CommandArgument='<%# Eval("id") %>' CommandName="Edit"/>
<asp:Button ID="Button6" runat="server" Text="Insert" CommandArgument='<%# Eval("id") %>' CommandName="Insert"/>

if (e.CommandName == "Del")
{
Button3_Click(null, null);
}
else if (e.CommandName == "Edi")
{

}
....

فکر کنم این روش ها بیشتر برای زمانی کاربرد داره که به وسیله یه دیتاسورسی وصل هستیم و تیک های Insert , update و.. زده باشیم.

A.Yousefi
یک شنبه 30 بهمن 1390, 00:30 صبح
بله به اون روش میشه.


فکر کنم این روش ها بیشتر برای زمانی کاربرد داره که به وسیله یه دیتاسورسی وصل هستیم و تیک های Insert , update و.. زده باشیم.
من سوالم این نبود که با این روش میشه یا نه!
اگه نمیشد که نمیپرسیدم اصلا،فقط خواستم بدونم وقتی با این روش میشه چرا RowCommand،همین!!
در ضمن گریدویو تیک Insert نداره!

fakhravari
یک شنبه 30 بهمن 1390, 01:43 صبح
foreach (GridViewRow row in GridView1.Rows)
در هر row میتوانید مقادیر بدست بیاریم که یک نوه RowCommand برای خودش.پ
فکر کنم هر کدوم توی کارهایی که میخواهین خودشون نشون میدن
برای مثال برای حذف یک رکورد ایا به روش RowCommand بهتره یا روش قبلی. اگر نحواهیم چک باکسی بزنیم.

A.Yousefi
یک شنبه 30 بهمن 1390, 17:57 عصر
foreach (GridViewRow row in GridView1.Rows)
در هر row میتوانید مقادیر بدست بیاریم که یک نوه RowCommand برای خودش.پ
فکر کنم هر کدوم توی کارهایی که میخواهین خودشون نشون میدن
برای مثال برای حذف یک رکورد ایا به روش RowCommand بهتره یا روش قبلی. اگر نحواهیم چک باکسی بزنیم.
اگه نخواهیم چک باکسی بزنیم و Delete تو هر سطر باشه که قطعا RowCommand بهتره چون آی دیو باید به CommandArg بایند کنیم.
از اینکه Foreach رو بهم معرفی کردین هم ممنون!