PDA

View Full Version : آبدیت رکوردهای دیتا گرید بصورت همه باهم



tayebeh
چهارشنبه 10 بهمن 1386, 09:19 صبح
با سلام به همه دوستان.
فکر کنم همه برنامه اعمال متداول با دیتاگرید را مطالعه کرده اید.تا جاییکه من می دونم برای ویرایش اطلاعات باید ابتدا عمل انتخاب توسط فرد موردنظر انجام شده . پس انجام تغییرات دکمه ویرایش زده شود.
آیا امکان دارد ، پس از بایند اطلاعات به دیتاگرید،همه رکوردها را در حالت ویرایش قرار داد تا کاربر بتواند همه را تغییر دهد و سپس با کلیک بر روی یک دکمه همه رکوردها با هم ویرایش شوند؟
اصلا همچین چیزی با توجه به خصوصیات دیتاگرید امکان دارد؟
با تشکر

Behrouz_Rad
چهارشنبه 10 بهمن 1386, 10:06 صبح
به به... همکار قدیمی! از این طرفا؟

یک خاصیت عمومی تعریف کن که مقدار وضعیت جاری مد Edit رو بپذیره:


private bool _IsInEditMode = false;

protected bool IsInEditMode

{

get { return this._IsInEditMode; }

set { this._IsInEditMode = value; }

}

قسمت اصلی کار در ایجاد ساختار GridView یا DataGrid ات هست:


<Columns>
<asp:TemplateField HeaderText="Column 1">
<ItemTemplate>
<asp:Label ID="lblTest" Visible='<%# !(bool) IsInEditMode %>' runat="server" Text='<%# Eval("myField") %>' />
<asp:TextBox ID="txtTest" Visible='<%# IsInEditMode %>' runat="server" Text='<%# Eval("myField") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>

کدهای فوق واضح هستند و فکر نمی کنم نیازی به توضیح داشته باشند.

و در روال Page_Load


protected void Page_Load(object sender, EventArgs e)
{
_IsInEditMode = true;
BindData();
}

موفق باشید.

mahdi_farhani
چهارشنبه 10 بهمن 1386, 10:30 صبح
بله امکانش هست

یک خاصیت عمومی تعریف کن که
آقای راد منظورت از خاصیت عمومی چیه ، اگر میشه بیشتر توضیح بدید.
******
شما ستون ها را از نوع Templatefield بزاریدو به جای Label از Textbox و Radio و.... استفاده کنید. یه دکمه تو Footer بزاریدبرای ویرایش. از اونور یه حلقه ForEach برای خوندن سطرها و Update یک DataTable ، دسته آخر هم کل DataTable به دیتابیس بفرسید برای Update .
البته مشکلی که اینجا هست باید صفحه به صفجه ویرایش رو بزنه.
*************
ولی باید راه ساده تری هم باشه . منتظر جواب مهندس راد هستم.

Behrouz_Rad
چهارشنبه 10 بهمن 1386, 12:04 عصر
خیلی عجیبه!!!
پست من کامل ارسال شد اما نمی دونم چرا ناقص نشون داده شد!!!
اصلاحش کردم...

mahdi_farhani
چهارشنبه 10 بهمن 1386, 12:40 عصر
مهندس جان راهی برای Pageing هست یا نه .
اصلاً این روشی که من گفتم درسته ؟

Behrouz_Rad
چهارشنبه 10 بهمن 1386, 13:38 عصر
راهی برای Pageing هست یا نه .
چه مشکلی با Paging داری؟


اصلاً این روشی که من گفتم درسته ؟

تو حالتی رو در نظر نگرفتی که GridView در مد ویرایش نیست!

mahdi_farhani
چهارشنبه 10 بهمن 1386, 14:01 عصر
مهندسی جان من با Pageing مشکل ندارم ، کاربر مشکل داره ......
مشکلش اینه که به فرض 100 رکورد داریم ، اینها باید به هرنحوه Pageing داشته باشه ، شده حتی 2 صفحه درسته ؟!
حالا با این کاری که من میکنم مجبور اول صفحه اول را Save کنه بعد بره صفحه بعدی رو تغییر بده
مشکل اینه .
بله .....او حالت رو شما درست می فرمایید

tayebeh
چهارشنبه 10 بهمن 1386, 14:11 عصر
سئوال دیگر اینکه چطور می شود با تب در تکس باکسهای داخل یک دیتا گرید در حالت انتخاب رکوردها حر کت کرد؟
باتشکر

Behrouz_Rad
چهارشنبه 10 بهمن 1386, 14:16 عصر
مشکلش اینه که به فرض 100 رکورد داریم ، اینها باید به هرنحوه Pageing داشته باشه ، شده حتی 2 صفحه درسته ؟!
مشکلش اینه که به فرض 100 رکورد داریم ، اینها باید به هرنحوه Pageing داشته باشه ، شده حتی 2 صفحه درسته ؟!
حالا با این کاری که من میکنم مجبور اول صفحه اول را Save کنه بعد بره صفحه بعدی رو تغییر بده

خوب؟ حالا مشکل چیه؟

mahdi_farhani
چهارشنبه 10 بهمن 1386, 14:20 عصر
خوب مشکل، اولتون با همون کدی که آقا بهروز گفتن حل میشه ، یعنی شما اگر همون اول نمیخواهی بری تو حالت Update خصوصیت برابر False بزار و هرقت خواستی اونو True کن و بایند کن .....
برای سوال دومت هم یک کد جاوا اسکریپت تو سایت گذاشتم سرچ کن پیداش میکنی.

mahdi_farhani
چهارشنبه 10 بهمن 1386, 14:22 عصر
میگم من مشکل ندارم باش ، کاربر که گیر داده میگه من میخواهم اول برم صفحه بعدی رو ویرایش کنم بعد ذخیره کنم .
البته براش یه راه حل پیدا کردم ، تو Paging بیام اطلاعات صفحه رو نگه دارم بعد دسته آخر ذخیره کنم .

Behrouz_Rad
چهارشنبه 10 بهمن 1386, 14:37 عصر
سئوال دیگر اینکه چطور می شود با تب در تکس باکسهای داخل یک دیتا گرید در حالت انتخاب رکوردها حر کت کرد؟
این سوال باید در بخش مباحث مربوط به JavaScript، HTML مطرح بشه.
به هر حال...
با استفاده از جاوا اسکریپت به راحتی می تونی این کار رو انجام بدی.
در زمان فشردن کلید Tab، به ترتیب رویدادهای onkeydown و onkeyup فراخوانی میشن.
از اونجایی که ماهیت کلید Tab در وب فرم ها، حرکت از عنصری به عنصر دیگر هست، متاسفانه نمیشه در زمان فشردن کلید Tab، مانع قرار گیری Focus بر روی عنصر دیگری شد.
خوشبختانه میشه این مشکل را با استفاده از تابع setTimeout با مقدار دهی صفر به زمان اجرای تابع حل کرد:


function CheckTab(el) {
if ((document.all) && (9==event.keyCode)) {
setTimeout("ProcessTab('" + el.id + "')", 0)
}
}

function ProcessTab(id) {
document.all[id].focus()
}

سورس صفحه رو ببین تا متوجه بشی که نامگذاری TextBox ها در GridView به چه شکل انجام شده.
سپس تابعی بنویس که نام TextBox بعدی رو با توجه به TextBox جاری پیدا کنه.
این تابع رو باید در روال RowDataBound فراخوانی کنی و به TextBox جاری ارجاء پیدا کنی و ID ی پیدا شده ی TextBox بعدی رو در جایی ذخیره کنی و در مرحله ی بعد وقوع RowDataBound این ID رو در روال onkeydown تکست باکس به تابع CheckTab پاس بدی.

گیج شدی، نه؟ با دقت بخون متوجه میشی ;)

موفق باشید.

mehrdad201
چهارشنبه 10 بهمن 1386, 16:48 عصر
مهندسی جان من با Pageing مشکل ندارم ، کاربر مشکل داره ......
مشکلش اینه که به فرض 100 رکورد داریم ، اینها باید به هرنحوه Pageing داشته باشه ، شده حتی 2 صفحه درسته ؟!
حالا با این کاری که من میکنم مجبور اول صفحه اول را Save کنه بعد بره صفحه بعدی رو تغییر بده
مشکل اینه .
بله .....او حالت رو شما درست می فرمایید



من این کار رو کردم. واسه اینکه کاربر مجبور نشه قبل پیجینگ هی سیو باتون رو فشار بده من خودم تو paging فانکشن save رو فراخوانی می کنم.

tayebeh
شنبه 13 بهمن 1386, 12:46 عصر
باسلام;
لازم دیدم توضیحات بیشتری راجع به موضوعی که مطرح کردم بدم.
1- این برنامه در 2003 و با ای اس پی دات نت فریم وروک 1 طراحی شده است.
2- در دیتاگرید مربوطه همیشه 12رکورد نمایش داده میشود.به همین دلیل مشکلی از بابت پیجینگ صفحه پیش نخواهد آمد.
3-من از روش تعریف متغییر عمومی استفاده نکردم. به شکل زیر کار کردم:

<code> <asp:TemplateColumn HeaderText="فشار">
<ItemTemplate>
<asp:TextBox ID="TFeshar" Runat="server" Width="50" ></asp:TextBox>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TxtFeshar" TabIndex="2" Runat="server" Font-Name="tahoma" Font-Size="10pt" Width="40px"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateColumn> </code>


یعنی مستقیما یک تکس باکس در قسمت آیتم تمپلت تعریف کردم .سپس در رویداد آیتم دیتا بایند دیتاگرید اطلاعات رو به تکس باکس پاس می دم .
4- وقتی از تکس باکس در قسمت آیتم تمپلت استفاده می کنم خصیصه تکس آن جزء خصایصش محسوب نمی شود و اگر خودم آنرا در قسمت خصایصش بیاورم هنگام اجرا پیغام خطا می دهد.شاید این مشکل در 2003 وجود داشته باشد و در نسخه های بالاتر برطرف شده باشد.
5- در مورد خصیصهvisibile هنگامیکه از روش آقای راد استفاده کردم پیغام خطا صادر کرد.چون این خصیصه فقط دو مقدار true و false را می شناسد و لاغیر.(بازم می گم شاید 2003 اینجوریه)

اما مشکلاتی که دارم :

1- اگر بخواهم مقادیر تکس باکسهای هر سطر را بخوانم باید چیکار کنم؟
2-در دیتا گرید روال RowDataBoundوجود ندارد؟

به پیوست تصاویر لازم آمده است .عکس ax1 طراحی قبلی بوده که قرار است به عکس ax2 تغییر کند.

mahdi_farhani
شنبه 13 بهمن 1386, 13:19 عصر
1- از FindControl استفاده کن برای پیدا کردن Textbox ها در هر سطر
2-فکر کنم ItemDataBound یا یچی تو این مایه های باشه ، الان دقیقاً یادم نیست ، چون تقریباً یکسالی میشه 2003 کار نکردم .
-----------------------------
5-دو تا کار میتونی بکنی :
1-روش غیر استاندار و اصلاً توصیه نمیکنم . قبلاً ما اینطوری بش کلک میزدیم (البته با VB) تو دیتابیس از نوع cahr میگرفتیم و مقدار trueو false ذخیره میکردیم .
2-یه تابع براش بنویس و اونو صدا بزن و خرجی تابع از نوع boolean هست و ورودی از نوع object حالا یه شرط بزار که اگر 0 بود False و اگر نبود true
...........
اگر میشه کدتو بزار تا بهتر بتونیم تصمیم بگیریم.

tayebeh
شنبه 13 بهمن 1386, 16:33 عصر
1-دقیقتر بگم چطور میشه به سطرها دسترسی پیدا کرد؟البته اینجا من همیشه 12 رکورد دارم یعنی تعداد سطرهام مشخصه ولی اگر تعداد سطرها مشخص نبودند باید چیکار می کردم؟
2-ببخشید چرا شما وقتی قطعه کد در جواباتون هست مرتبه ولی قطعه کدهای من نامنظم نمایش داده میشه؟

mahdi_farhani
شنبه 13 بهمن 1386, 18:39 عصر
1-خوب دوست عزیز با حلقه ForEach میتونی اینکارو بکنی ، dataGrid.rows باید داشته .....
2-از نگ کد استفاده کن علامت # تو HtmlEditor رو بزن و یا خودت تایپ کن
(البته بین oوd نباید فاصله باشه )