【问题标题】:capture multiple values from grid view to pass to a stored procedure从网格视图中捕获多个值以传递给存储过程
【发布时间】:2013-02-15 13:45:38
【问题描述】:

asp.net 和 C#

这里我有来自 gridview 控件的列

当用户单击任一按钮时,我需要将 CaseID、CaseworkerID、EventDate 和 Code 的值传递给存储过程

但是如何将多个参数传递给我的 onclick 方法????

<columns>
<asp:BoundField DataField="CaseID" HeaderText="CaseID" Visible = "False" />
<asp:BoundField DataField="caseworkerID" HeaderText="CwID" Visible = "False" />
<asp:BoundField DataField="CaseWorker" HeaderText="Case Worker" />
<asp:BoundField DataField="EventDate" HeaderText="Event Date" />
<asp:BoundField DataField="Code" HeaderText="Code" />
  <asp:TemplateField HeaderText="ADD">
       <ItemTemplate> 
                    <asp:Button  ID="AddUnit" runat="server" Text=" +1 " onserverclick="AddUnit_Click"/>
        </ItemTemplate> 
   </asp:TemplateField> 

<asp:BoundField DataField="TotalUnits" HeaderText="Total Units" />

  <asp:TemplateField HeaderText="DDT">
       <ItemTemplate> 
          <asp:Button ID="DdtUnit" runat="server" Text=" -1 " onserverclick="DdtUnit_Click"/>
        </ItemTemplate> 
   </asp:TemplateField> 


<asp:BoundField DataField="EventType" HeaderText="Event Type" />
<asp:BoundField DataField="UnitCost" HeaderText="Unit Cost" />
<asp:BoundField DataField="TotalCost" HeaderText="Total Cost"/>

编辑: 所以我现在有了这个

            <ItemTemplate> 
                <asp:Button  ID="AddUnit" runat="server" Text=" +1 " 
                CommandName="AddUnit" 
                CommandArgument='<%# Eval("CaseID")+ ";" + Eval("caseworkerID")+ ";" + Eval("EventDate")+ ";" + Eval("Code")%>'/>
            </ItemTemplate> 

这是一个好的开始

【问题讨论】:

  • 嗨!您应该查看按钮的commandargumentcommandname 属性

标签: c# asp.net gridview parameter-passing


【解决方案1】:

首先对网格的所有按钮使用不同的命令名

protected void grid_RowCommand(object sender, GridViewCommandEventArgs e)
{
    string city="";
    if (e.CommandName == "btnname")
    {
        ImageButton imgbtn = (ImageButton)e.CommandSource;
        GridViewRow rows = (GridViewRow)imgbtn.NamingContainer;
        city = grid.Rows[rows.RowIndex].Cells[1].Text;           
    }

}

根据您的要求使用列的单元格 ID。并且列 id 从 0 开始。

任何问题都可以问我

【讨论】:

  • 是的,我只是说我不记得我写答案时的名字了,脑子放屁;)
【解决方案2】:

您几乎想要做的是创建一个由特殊字符分隔的命令参数。处理事件时,从事件 (e) 中提取命令参数并将其拆分。 (正如 utkarshs 的回答所示,使用 gridviews rowcommand 事件,而不是 onclick)

如果命令参数数据实际上包含用于分隔符的相同字符,这可能会导致问题。不过只有一个建议(我们有时会这样做,当我们知道像 productId 这样的东西不包含管道 (|) 时)

编辑: 所以你的按钮应该是......

  <asp:button CommandArgument='<%# Eval("someValue") + " | " 
              + Eval("someOtherValue") + " | " %>'  
             CommandName="whatever" runat="server" text="FOO BAR" />

然后在您的网格 ID 为 gridId 的代码后面

protected void gridId_RowCommand(object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "btnname")
    {
        string[] differentValues = e.CommandArgument.ToString().Split("|");           
    }
}

【讨论】:

  • 好的,所以我们有一个事件处理程序,而不是点击事件,
  • @Sonny123 是的,因为每一行在 gridview 中都有自己的按钮,所以您想像 Utkarsh 一样处理 gridview“RowCommand”处理程序。但是,使用 e.CommandArgument 并将其拆分为分隔符。然后,您可以根据需要通过按钮单击传递任意数量的值。你只需要动态地构建它们。见编辑
  • 我仍然使用它,但是编译器说 CommandArgument 是一个对象(不是字符串),所以没有方法可以拆分......但我想到了制作一个数组。如果 Eval("someValue") 得到一个字符串值,Eval(someValue) 会得到一个整数还是最好将所有作为字符串传递并稍后在后面的代码中进行转换?
  • @Sony123 是的,就是这样,对不起,内存不足。刚刚打开VS来使用它。稍后在后面的代码中将其转换,因为您仍然需要 .ToString() CommandArgument 并将其转换回
  • e.CommandArgument.ToString().Split(new char[] { ';' });最终会得到语法!现在我是一只快乐的兔子!感谢您的帮助
最近更新 更多