我有多个行一个gridview,各自具有更新按钮和我需要通过对更新按钮2点的值,当有人点击。 除了包装内CommandArgument参数由逗号分隔的(过时的和不优雅),我将如何多于一个参数传递更多?

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

作为一个说明,该值不能与网页上的任何控件检索,所以我目前不寻求任何设计方案。

有帮助吗?

解决方案

戳后围绕它看起来像凯尔是正确的。

只要用逗号或东西,当你想使用它拆了。

其他提示

可以通过分号分隔值作为命令的参数,然后分割字符串,并使用它。

<asp:TemplateField ShowHeader="false">
    <ItemTemplate>
       <asp:LinkButton ID="lnkCustomize" Text="Customize"  CommandName="Customize"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
       </asp:LinkButton>   
    </ItemTemplate>   
</asp:TemplateField>

在服务器侧

protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
      string[] arg = new string[2];
      arg = e.CommandArgument.ToString().Split(';');
      Session["IdTemplate"] = arg[0];
      Session["IdEntity"] = arg[1];
      Response.Redirect("Samplepage.aspx");
}

希望它有助于!!!!

@帕特里克的回答是一个好主意,值得更多的信贷!你可以有很多的数据项,只要你想,他们都分开,并在必要时,可以使用客户端。

它们也可以声明方式添加,而不是代码。我只是做这个像这样的GridView的:

<asp:TemplateField HeaderText="Remind">
  <ItemTemplate>
    <asp:ImageButton ID="btnEmail"  
        data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
        data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
        CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
  </ItemTemplate> 
</asp:TemplateField>

在RowCommand,你这样做:

void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Email")
    {
        var btnSender = (ImageButton)e.CommandSource;
        var riderName = btnSender.Attributes["data-rider-name"];
        var riderEmail = btnSender.Attributes["data-rider-email"];
        // Do something here
    }
}

因此更清洁比用定界符黑客所有值在一起,并在结束时再次拆包。

不要忘记测试/清洁您从页面取回任何数据,以防它被篡改了!

我的做法是使用收集的属性添加到HTML数据 - 从后面的代码属性。这是更内嵌jQuery和客户端脚本。

// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();


// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );

然后通过属性收集检索值

string val = targetBtn.Attributes["data-{your data name here}"].ToString();

一个做同样加入到上述注释的小更优雅的方式..

<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
                           AutoGenerateColumns="false"
                            OnRowDeleting="deleteRow"
                         GridLines="Vertical">
      <asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
      <asp:BoundField DataField="EntityId" HeaderText="EntityId"  />
    <asp:TemplateField ShowHeader="false">
        <ItemTemplate>
           <asp:LinkButton ID="lnkCustomize" Text="Delete"  CommandName="Delete"  CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>'  runat="server"> 
           </asp:LinkButton>   
        </ItemTemplate>   
    </asp:TemplateField>
     </asp:GridView>

和在服务器端:

protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
    string IdTemplate= e.Values["IdTemplate"].ToString();
    string EntityId = e.Values["EntityId"].ToString();

   // Do stuff..
}

它要么存储在GridView DataKeys集合,或者将其存储在隐藏字段相同的细胞内,或加入值加在一起。这是唯一的出路。你不能两个值存储在一个链接。

如果你想传递的两个值后,您可以使用此方法

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
 OnClick="RemoveFromRole_Click" />

基本上我治疗{CommmandName,CommandArgument}作为密钥值。从数据库字段设置两者。你将不得不在这种情况下,我认为这是更干净的代码使用OnClick事件和使用OnCommand事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top