PDA

View Full Version : OnItemCommand



hassan_RK
سه شنبه 05 مهر 1384, 11:55 صبح
با سلام
درقسمتی از برنامه نیاز دارم که در دیتا گرید دو تا لینک بزارم که روی هر کدام کلیک شد محتویات همون سطر را بگیره و....
از دوتا asp:ButtonColum استفاده کردم و commandName یکی p دیگری ep هست
و تابع مربوطه هم به صورت زیر می باشد


( Sub EditDatagrid(ByVal s As Object, ByVal e As DataGridCommandEventArgs
if e.Command="p" then
( response.write(dataGrid1.Items(e.Item.ItemIndex).c ells(2).tex
elseif e.CommandName="ep" then
( response.write(dataGrid1.Items(e.Item.ItemIndex).c ells(3).tex
endif

فقط این دستورات را اجرا نمی کند دستورات دیگه که بین if بیاید را اجرا می کند اما اگه یکی از
asp:ButtonColum را حذف کنم و فقط دستور زیر را داشته باشم اجرا می شود


( Sub EditDatagrid(ByVal s As Object, ByVal e As DataGridCommandEventArgs
if e.Command="p" then
( response.write(dataGrid1.Items(e.Item.ItemIndex).c ells(2).tex
endif

لطفا راهنمایی بفرمائید چیکار کنم

Behrouz_Rad
سه شنبه 05 مهر 1384, 13:43 عصر
1) سعی کنید حتی الامکان نام روال هایی که در VS.NET به طور پیش فرض برای کنترل ها تعیین شده است را تغییر ندهید.
2) همیشه نام معنا داری برای روال های خود و همچنین Command ها انتخاب کنید. (EditDataGrid نام چندان جالبی نیست و گمراه کننده است. ItemCommand که نام پیش فرض است، بهترین حالت است)
3) از آنجا که نام روال ItemCommand کنترل DataGrid تغییر پیدا کرده، باید خاصیت OnItemCommand کنترل DataGrid را به صورت دستی در فایل aspx به مقدار EditDataGrid تنظیم کنید که احتمالا اینکار را انجام داده اید.
4) متغیر e خاصیتی با نام Command ندارد!
خاصیت CommandName تنها مرجع در دسترس شما برای تشخیص نوع Command انتخابی است.

مورد خاص دیگری وجود ندارد.
موفق باشید.

hassan_RK
چهارشنبه 06 مهر 1384, 10:35 صبح
با سلام
از راهنمایی شما متشکرم
وقتی AutoGenerateColums دیتا گرید را false می کنم و یه تمپلت به دیتا گرید اضافه می کنم مشکلی که در بالا توضیح دادم ایجاد می شه در غیر اینصورت مشکلی نیست .

چیکار باید کنم که هم از OnItemCommand استفاده کنم هم AutoGenerateColums=false باشه
توضیحات بالا را هم که آقای راد فرمودند رعایت کردم

Behrouz_Rad
چهارشنبه 06 مهر 1384, 13:31 عصر
کدهای مربوط به DataGrid در فایل aspx را در اینجا بنویسید.

hassan_RK
پنج شنبه 07 مهر 1384, 11:05 صبح
<script runat=server>
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If Not IsPostBack Then
DataGridBind()
End If
End Sub

Sub ItemCommand(ByVal s As Object, ByVal e As DataGridCommandEventArgs)
If e.CommandName = "ep" Then
Response.Write("ep")
TextBox1.Text = DataGrid1.DataKeys(e.Item.ItemIndex)
ElseIf e.CommandName = "dp" Then
Response.Write("dp")
TextBox1.Text = DataGrid1.Items(e.Item.ItemIndex).Cells(0).Text؟ ؟؟؟؟
End If
End Sub
Sub DataGridBind()
Dim con As OleDb.OleDbConnection
Dim com As OleDb.OleDbCommand
Dim ds As DataSet
Dim da As OleDb.OleDbDataAdapter
con = New OleDb.OleDbConnection("provider=microsoft.jet.oledb.4.0;data source="& server.MapPath(myDB.mdb)
ds = New DataSet
da = New OleDb.OleDbDataAdapter("select * from Table ", con)
da.Fill(ds, "Table")
DataGrid1.DataSource = ds
DataGrid1.DataBind()
End Sub
</script>


<form id="Form1" method="post" runat="server">
<asp:datagrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 72px; POSITION: absolute; TOP: 120px"
runat="server" AutoGenerateColumns="False" DataKeyField="id" OnItemCommand="ItemCommand" Height="101px"
Width="673px">
<Columns>
<asp:TemplateColumn HeaderText="سئوالات مطرح شده">
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" Width="500px" VerticalAlign="Middle"></ItemStyle>
<ItemTemplate>
<%# container.dataitem("soal")%>
</ItemTemplate>
</asp:TemplateColumn>
<asp:ButtonColumn Text ="ارسال پاسخ" CommandName="ep">

<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" Width="200px"></ItemStyle>
</asp:ButtonColumn>
<asp:ButtonColumn Text="نمایش پاسخ ها" CommandName="dp">
<HeaderStyle HorizontalAlign="Center"></HeaderStyle>
<ItemStyle HorizontalAlign="Center" Width="200px"></ItemStyle>
</asp:ButtonColumn>
</Columns>
<PagerStyle Mode="NumericPages"></PagerStyle>
</asp:datagrid><asp:textbox id="TextBox1" style="Z-INDEX: 102; LEFT: 72px; POSITION: absolute; TOP: 72px" runat="server"
Height="32px" Width="248px"></asp:textbox></form>
</body>
</HTML>

در جلوی سطری که علامت سئوال گذاشتم مشکل دارم
اگر AutoGenerateColumns="true باشد و از تمپلت استفاده نکنم مشکلی ندارد

با تشکر فراوان

Behrouz_Rad
جمعه 08 مهر 1384, 11:23 صبح
حالا میشه خیلی راحت و با قاطعیت در مورد مشکلی که پیدا کردید صحبت کرد.
خوب دقت کنید.
آیتم هایی که با استفاده از نوع ButtonColumn کنترل DataGrid ایجاد می شوند، از نوع کنترل LinkButton محسوب می شوند.
در کد فوق شما سعی در به دست آوردن متن اولین ستون کرده اید و اینکار قبل از انجام یک Type Casting میسر نیست.
ابتدا باید با تبدیل آیتم انتخاب شده به نوع LinkButton، یک ارجا به آیتم به دست آورید و سپس همانند یک کنترل معمولی، از خواص آن استفاده کنید.
دستور بعد از Else را به شکل زیر بنویسید:


Dim myLnkButton As LinkButton = CType(DataGrid1.Items(e.Item.ItemIndex).Cells(0).C ontrols(0), LinkButton)
Response.Write(myLnkButton.Text)

موفق باشید.

hassan_RK
شنبه 09 مهر 1384, 16:06 عصر
با سلام

error می ده
Exception Details: System.InvalidCastException: Specified cast is not valid.

از توجه شما سپاسگزارم

Behrouz_Rad
شنبه 09 مهر 1384, 21:25 عصر
امکان نداره!
باز هم برای اطمینان بیشتر تست کردم و دقیقا متن ردیف انتخاب شده برگشت داده شد!
بیشتر دقت کنید.
موفق باشید.

hassan_RK
یک شنبه 10 مهر 1384, 10:27 صبح
PRB: Error message: System.InvalidCastException: Specified Cast is not valid

SYMPTOMS
When you view your ASP.NET page in the browser, you may receive the following error message:
Specified cast is not valid.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Specified cast is not valid.
CAUSE
This problem might occur on postback because the control tree hierarchy is re-ordered. On postback, the view state for controls is loaded based on the positions of the controls (indexes) in the control tree. The hierarchy that is created on postback must match the hierarchy that is used initially when the view state is saved.
RESOLUTION
Make sure that the control tree is re-created on postback in the same order that it was saved at the end of the previous request.

راهنمایی بفرمائید .

mohi_ka2
شنبه 07 مهر 1386, 08:59 صبح
دستور بعد از Else را به شکل زیر بنویسید:


Dim myLnkButton As LinkButton = CType(DataGrid1.Items(e.Item.ItemIndex).Cells(0).C ontrols(0), LinkButton)
Response.Write(myLnkButton.Text)


موفق باشید.
سلام
می شه لطفا کد بالا رو به زبان C# هم بذارید چون من که خواستم به اون زبان بنویسم همین کد رو اشکال گرفت . من هم همین مشکل رو دارم. یعنی می خوام روی یک لینک باتن کلیک کنم و بعدش متنی رو در رابطه با همون رکورد در پایین صفحه نمایش بده
ممنون:لبخندساده:

lvenoos
سه شنبه 08 آبان 1386, 16:45 عصر
با سلام
من هر کدی رو که در بخش datagrid_itemcommandمی نویسم ، اجرا نمی شود، errorهم نمیگیرد! مشکل از کجاست؟

lvenoos
چهارشنبه 09 آبان 1386, 10:50 صبح
فهمیدم مشکل از کجا بوده، نوعش رو اشتباهی push buttonانتخاب کرده بودم، که باید link button می بود.حالا اگه push button باشه ، باید کدها رو کجا نوشت؟ باتشکر