PDA

View Full Version : سوال: کمک فوری--در مورد بروز رسانی اطلاعات درون gridView بصورت ویرایش درجا



baha_film
یک شنبه 02 مرداد 1390, 12:09 عصر
من میخوام یه GridView داشته باشم که بتونم به صورت درجا UpDate اش کنم
4تا ستون دارم که به کمک SqlDataSource بایند شدن.
ستونها از نوع templateField بوده و توشون label هست
تو قسمت EditItemTemplate هم یه TextBox هست که میخوام با زدن دگمه edit که از نوع templateField هست اون ردیف خاص به حالت ویرایش بره و امکان ویرایش باشه.
مشکل اینجاست که وقتی Edit رو میزنم ارور زیر رو میده
:Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page. For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them. If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
و به حالت ویرایش نمیره
در ضمن برای دکمه Edit که به شکل Image هست CommandArgument رو برابر Eval("ID") قرار دادم
من میخوام وقتی edit رو زدم به جای labelتو همون ردیف textbox نمایش داده بشه
لطفا راهنمایی کنید

smm2006sh
یک شنبه 02 مرداد 1390, 16:34 عصر
سلام
خود دیتا گرید امکان درج و حذف و اپدیت داره اما استفاده از اون یه کم قلق داره
شما به وسیله اون دیتا سورسی که بهش متصله >> توی خصوصیاتش ، update quaty , delet quary و اینا را ابتدا باید دستورات command اونو بنویسی سپس این خصوصیات به دیتا گرین اضافه میشه

baha_film
دوشنبه 03 مرداد 1390, 10:35 صبح
نمیخوام CommandButton ها استفاده کنم. میخوام از Template field استفاده کنم و به جای Button هم از Image Button استفاده کردم.
مشکل اینجاست که نمیدونم از کدوم رویداد و با چه دستوری میتونم GRIDVIEW رو به حالت Edit ببرم تا تو همون سطر جاری به جای Labelها TextBox ها نمایش داده بشه.
اگه تو این زمینه راهنماییم کنید ممنون میشم

baha_film
دوشنبه 03 مرداد 1390, 17:26 عصر
اساتید.....................................: عصبانی++:
هیچ کس در این مورد اطلاعاتی نداره.
بابا به خدا چیز پیچیده ای نیستا .تو خیلی از سایت ها از این روش ها استفاده میشه

Himalaya
دوشنبه 03 مرداد 1390, 19:31 عصر
سلام

هیچ کس در این مورد اطلاعاتی نداره.
بابا به خدا چیز پیچیده ای نیستا
:متفکر:
شما یه ستون به صورت TemplateField اضافه میکنی به گرید، مخصوص دکمه ها. بعد تو این ستون
کافیه یه ImageButton بزاری تو ItemTemplate و بعد خصوصیت CommandName اون رو با Edit ست کنی. Edit یعنی سطر جاری رو ببر تو حالت ویرایش. بعد تو EditItemTemplate دو تا دکمه دیگه میزاری اما این بار با CommandName های Update و Cancel. اولی یعنی دستور ویرایش رو اجرا کن و Cancel هم که یعنی سطر رو از حالت ویرایش خارج کن. یعنی یه ستون به صورت زیر باید به گریدت اضافه کنی

<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Edit" ImageUrl="~/41.ico" />
</ItemTemplate>
<EditItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Update" ImageUrl="~/45.ico" />
<asp:ImageButton ID="ImageButton2" runat="server" CommandName="Cancel" ImageUrl="~/57.ico" />
</EditItemTemplate>
</asp:TemplateField>
واسه بقیه ستونهات هم که گفتی به صورت ItemTemplate تعریفشون کردی، هر کدوم رو که میخای برن تو حالت ویرایش، تگ EditItemTemplate هم براشون تعریف میکنی و تو هر کدوم یه تکست باکس میزاری و خصوصیت Text اونو توسط دستور Eval ست میکنی
واسه دکمه های Edit و Cancel که لازم نیست کار خاصی انجام بدی (خود CommandName کار لازم رو انجام میده). اما واسه Update باید. دستور Update رو تو دیتاسورست ست کنی.

baha_film
سه شنبه 04 مرداد 1390, 12:41 عصر
سلام

:متفکر:
شما یه ستون به صورت TemplateField اضافه میکنی به گرید، مخصوص دکمه ها. بعد تو این ستون
کافیه یه ImageButton بزاری تو ItemTemplate و بعد خصوصیت CommandName اون رو با Edit ست کنی. Edit یعنی سطر جاری رو ببر تو حالت ویرایش. بعد تو EditItemTemplate دو تا دکمه دیگه میزاری اما این بار با CommandName های Update و Cancel. اولی یعنی دستور ویرایش رو اجرا کن و Cancel هم که یعنی سطر رو از حالت ویرایش خارج کن. یعنی یه ستون به صورت زیر باید به گریدت اضافه کنی

<asp:TemplateField>
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Edit" ImageUrl="~/41.ico" />
</ItemTemplate>
<EditItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Update" ImageUrl="~/45.ico" />
<asp:ImageButton ID="ImageButton2" runat="server" CommandName="Cancel" ImageUrl="~/57.ico" />
</EditItemTemplate>
</asp:TemplateField>
واسه بقیه ستونهات هم که گفتی به صورت ItemTemplate تعریفشون کردی، هر کدوم رو که میخای برن تو حالت ویرایش، تگ EditItemTemplate هم براشون تعریف میکنی و تو هر کدوم یه تکست باکس میزاری و خصوصیت Text اونو توسط دستور Eval ست میکنی
واسه دکمه های Edit و Cancel که لازم نیست کار خاصی انجام بدی (خود CommandName کار لازم رو انجام میده). اما واسه Update باید. دستور Update رو تو دیتاسورست ست کنی.


دوست عزيز اينكار هارو طبق گفته شما انجام دادم ولي ارور EnableEventValidation ميداد و برابر false كردم و حل شد ولي حالا به حالت Edit يا همون EditItemTemplate نميره .
textBox ها رو هم گذاشتم.
يه نسخه از برنامه رو هم ميذارم اگه براتون امكان داشت بررسي كنيد ببنيد من كجا اشتباه دارم
ممنون

Himalaya
سه شنبه 04 مرداد 1390, 12:47 عصر
پس کو اون نسخه از برنامه؟

baha_film
سه شنبه 04 مرداد 1390, 13:03 عصر
7294072938فایل های ضمیمه :
.net 2010
sql 2005

baha_film
سه شنبه 04 مرداد 1390, 13:05 عصر
فایل ها رو ضمیمه کردم

Himalaya
سه شنبه 04 مرداد 1390, 16:01 عصر
سلام
تو پست 1 گفتید

4تا ستون دارم که به کمک SqlDataSource بایند شدن.ولی تو پروژه ای که ضمیمه کردید خبری از SqlDataSource نبود و گرید رو به با کد نویسی پر کردید. (کلا صورت سوال رو تغییر دادی). با این حال
اگه بخواید گرید رو با کد نویسی بایند کنید، واسه عملیات Update و Edit و Cancel باید برای ایونت های RowEditing و RowCancelingEdit و RowUpdating از کنترل گرید کد بنویسید (درست مثل زمانی که گرید رو با کد نویسی بایند میکنید و میخواید Paging اون رو هم فعال کنید که در این صورت باید برای ایونت PageIndexChanging گرید کد بنویسید). دیگه توضیح نمیدم. کدای زیر رو تو پروژت Copy Paste کن و خودت روال کار رو ببین
ضمنا آقای موسوی و فلاح یه بحثی داشتن در مورد نحوه کد نویسی صحیح (یا یه همچین چیزی) یه قسمتی داشت تحت عنوان کدهای بو دار. اون بحث رو بخون
کدهای صفحه WebForm1.aspx


<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" Width="700px"
OnRowEditing="GridView2_RowEditing" OnRowCancelingEdit="GridView2_RowCancelingEdit"
OnRowUpdating="GridView2_RowUpdating" DataKeyNames="ID">
<Columns>
<asp:TemplateField HeaderText="نام کالا" ItemStyle-Width="125px">
<ItemTemplate>
<asp:Label ID="Label18" runat="server" Text='<%# Bind("StuffName") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Txt6" runat="server" Text='<%# Bind("StuffName") %>' Width="120px"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="برند" ItemStyle-Width="125px">
<ItemTemplate>
<asp:Label ID="Label19" runat="server" Text='<%# Bind("Brand") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Txt7" runat="server" Text='<%# Bind("Brand") %>' Width="120px"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="کشور سازنده" ItemStyle-Width="125px">
<ItemTemplate>
<asp:Label ID="Label20" runat="server" Text='<%# Bind("Made") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Txt8" runat="server" Text='<%# Bind("Made") %>' Width="120px"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="قیمت" ItemStyle-Width="125px">
<ItemTemplate>
<asp:Label ID="Label21" runat="server" Text='<%# Bind("Price") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Txt9" runat="server" Text='<%# Bind("Price") %>' Width="120px"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="ویرایش" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:ImageButton ID="ImageButton1" runat="server" CommandName="Edit" ImageUrl="~/edit.gif" />
</ItemTemplate>
<EditItemTemplate>
<asp:ImageButton ID="ImageButton2" runat="server" CommandName="Update" ImageUrl="~/yes.gif" />
<asp:ImageButton ID="ImageButton3" runat="server" CommandName="Cancel" ImageUrl="~/no.gif" />
</EditItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
به غیر از ستون دکمه ها، بقیه ستونها میتونن به صورت asp:BoundField باشن و دلیلی نداره TemplateField تعریف کنید براشون.
DataKeyNames رو برای گرید تعریف نکردید
دلیلی نداره ستون ID بره تو حالت ویرایش و اصلا ستون ID دلیلی نداره تو گرید نمایش داده بشه (واسه دسترسی به ID از GridView2.DataKeys استفاده میشه.
هر جا که تو ItemTemplate (در صورتی که نمیخواید از BoundField استفاده کنید) از Label استفاده کردید، Label رو پاک کنید. مثلا به جای

<ItemTemplate>
<asp:Label ID="Label21" runat="server" Text='<%# Bind("Price") %>'></asp:Label>
</ItemTemplate>
از کد زیر استفاده کنید

<ItemTemplate>
<%# Eval("Price") %>
</ItemTemplate>
تو کد پست 5 من کجا خصوصیت CommandArgument رو ست کردم؟!! اینجا به این خصوصیت نیازی نیست

اما CodeBehind مربوط به صفحه WebForm1

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
FillGrid();
}

private void FillGrid()
{
var config = new MyConfig();
config.GridBind();
DataView dataView = config.DvGrid;
GridView2.DataSource = dataView;
GridView2.DataBind();
}

protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView2.EditIndex = e.NewEditIndex;
FillGrid();
}

protected void GridView2_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView2.EditIndex = -1;
FillGrid();
}

protected void GridView2_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string id = GridView2.DataKeys[e.RowIndex].Value.ToString();
string stuff = e.NewValues[0].ToString();
string brand = e.NewValues[1].ToString();
string made = e.NewValues[2].ToString();
string price = e.NewValues[3].ToString();
var config = new MyConfig();
config.GridUpdate(id, stuff, brand, made, price);
GridView2.EditIndex = -1;
FillGrid();
}

من فقط کدای این 2 بخش رو دستکاری کردم که برنامه فقط کار کنه (کنترل خطا ها و ... به عهده خودت)

http://amir-ajorlo.ir/MyUpFile/barnamenevis/17.jpg