در این مقاله نشان می دهیم که چگونه سطر گرید ویو، Button،LinkButton یا ImageButton ای که کلیک شده است را در رویدادهای OnClick و OnRowCommand مربوط به آن تشخیص دهیم. زمانی که یک Button، LinkButton یا ImageButton مشخص شد، به راحتی می توانیم ID، CommandName و CommandArgument آن را به دست بیاوریم.
CommandName
به دست آوردن GridView Row و Row Index در رویداد RowCommand
در زیر یک کنترل GridView با ButtonField و یک رویداد OnRowCommand داریم.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false" OnRowCommand = "OnRowCommand"> <Columns> <asp:ButtonField CommandName = "ButtonField" DataTextField = "CustomerID" ButtonType = "Button"/> </Columns> </asp:GridView>
حال اگر یکی از Buttonها کلیک شود، رویداد OnRowCommand اجرا می شود.
سی شارپ
protected void OnRowCommand(object sender, GridViewCommandEventArgs e) { int index = Convert.ToInt32(e.CommandArgument); GridViewRow gvRow = GridView1.Rows[index]; }
VB.Net
Protected Sub OnRowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) Dim index As Integer = Convert.ToInt32(e.CommandArgument) Dim gvRow As GridViewRow = GridView1.Rows(index) End Sub
RowIndex مربوط به سطر GridView در property با نام CommandArgument نگه داری می شود. بنابراین با این اندیس می توانید رفرنس سطر GridView را دریافت نمایید.
به دست آوردن GridView Row و Row Index در رویداد کلیک Button در TemplateField
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Button ID="Button1" runat="server" Text='<%#Eval("CustomerID")%>' CommandArgument = "Button1" OnClick = "Button1_Click" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
زمانی که Button کلیک می شود، رویداد کلیک اجرا می شود.
سی شارپ
protected void Button1_Click(object sender, EventArgs e) { GridViewRow gvRow = (GridViewRow)(sender as Control).Parent.Parent; int index = gvRow.RowIndex; }
VB.Net
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim gvRow As GridViewRow = CType(CType(sender, Control).Parent.Parent, _ GridViewRow) Dim index As Integer = gvRow.RowIndex End Sub
توجه داشته باشید که در این جا، sender را برای به دست آوردن GridView Row تبدیل (cast)کردیم. Sender یک کنترل Button است، بنابراین والد یک کنترل Button، Cell می باشد و والد Cell خود GridView Row می باشد.
Button ——->GridView Cell ——->GridView Row
همین کار را برای LinkButton و ImageButton نیز انجام می دهیم.
به دست آوردن CommandArgument در رویداد کلیک Button در TemplateField
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Button ID="Button1" runat="server" Text='<%#Eval("CustomerID")%>' CommandArgument = "Button1" OnClick = "Button1_Click" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
در بسیاری از مواقع، ما به property های یک Button مانند CommandName و CommandArgument نیاز داریم. بنابراین باید رفرنس آن را از طریق پارامتر sender به دست آوریم.
سی شارپ
protected void Button1_Click(object sender, EventArgs e) { Button btn = (Button)sender; string CommandName = btn.CommandName; string CommandArgument = btn.CommandArgument; }
VB.Net
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim btn As Button = CType(sender, Button) Dim CommandName As String = btn.CommandName Dim CommandArgument As String = btn.CommandArgument End Sub
همین کار را می توان با ایجاد یک شی و تخصیص sender به آن البته بعد از casting، برای LinkButton و ImageButtonنیز انجام داد.
چندین مقدار در CommandArgument
در حال حاضر، به طور پیش فرض هیچ propertyای برای آن وجود ندارد و ما باید از یک رشته الحاق شده استفاده کرده و سپس آن را به آرایه ای split کنیم. GridView زیر را در نظر بگیرید:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Button ID="Button1" runat="server" Text='<%#Eval("CustomerID")%>' CommandArgument= '<%#Eval("PostalCode") + "," + Eval("City") + "," + Eval("Country") %>' OnClick = "Button1_Click" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
حال برای به دست آوردن این مقادیر، باید به صورت زیر عمل کنیم:
سی شارپ
protected void Button1_Click(object sender, EventArgs e) { Button btn = (Button)sender; string[] CommandArgument = btn.CommandArgument.Split(','); string CommandArgument1 = CommandArgument[0]; string CommandArgument2 = CommandArgument[1]; string CommandArgument3 = CommandArgument[2]; }
VB.Net
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim btn As Button = CType(sender, Button) Dim CommandName As String = btn.CommandName Dim CommandArgument As String() = btn.CommandArgument.Split(",") Dim CommandArgument1 As String = CommandArgument(0) Dim CommandArgument2 As String = CommandArgument(1) Dim CommandArgument3 As String = CommandArgument(2) End Sub
همانطور که مشاهده می کنید ما به سادگی مقادیر را بر اساس جداکننده (در این جا کاما)، split کرده و آرایه ای از رشته ها ایجاد نمودیم.
موفق باشید !
هیچ دیدگاهی نوشته نشده است.