通过CommandArgument传递两个值并将其拆分

时间:2010-12-07 17:23:47

标签: c# asp.net webforms

我正在使用LinkBut​​ton的commandArgument属性(它包含在转发器中)将两个值 - 一个字符串 - 传递给第二个转发器然后我尝试将它们分成两个值,所以我可以将它们用作我的ADO.NET代码中的参数(SqlCommand Parameters)....测试后我的查询不返回任何结果但是如果我传递参数的固定值或更改参数的来源(仅用于从文本框或查询字符串进行测试)或者某事)我得到了我的结果,所以我认为问题在于分裂。

我从LinkBut​​ton的ArgumentCommand属性中执行一些arugment值 - 它包含在转发器中:

   <ItemTemplate>
         <asp:LinkButton id="sort_lnkbtn" Text='<%# Eval("value")%>' 
         CommandArgument='<%#string.Format("{0}|{1}",Eval("arrange_by_id"),Eval("value"))%>' runat="server">
      </asp:LinkButton>
   </ItemTemplate>

然后我收到这些值并将它们分成两部分信息:

        string sortByAndArrangeBy = (e.CommandArgument).ToString();
        char[] separator = { '|' };
        string[] sortByAndArrangeByArray = sortByAndArrangeBy.Split(separator);

现在,ado.net代码将此值用作

using (SqlConnection cn1 = new SqlConnection(ConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString))
                    {
                        using (SqlCommand cm1 = new SqlCommand("SELECT [name] FROM brands WHERE (name like @SearchString + '%' )", cn1))
                        {
                            cm1.Parameters.Add("@SearchString", System.Data.SqlDbType.Char);
                            cm1.Parameters["@SearchString"].Value = sortByAndArrangeByArray[1];

                            cn1.Open();
                            using (SqlDataReader dr1 = cm1.ExecuteReader())
                            {
                                List_rpt.DataSource = dr1;
                                List_rpt.DataBind();
                            }
                        }
                    }

1 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案:

在控件中包装转发器的项目模板。该控件将具有与没有绑定的项模板相同的标记:

控制标记:

<div>
    <asp:LinkButton ID="LnkBtnSort" runat="server" Text="Sort" OnClick="LnkBtnSort_Clicked"/>
</div>

控制代码:

public class SomeControl
{
     public event EventHandler Click;

     public string ArrangeById 
     { 
         set { ViewState["byid"] = value; } 
         get { return ViewState["byid"].ToString(); } 
     }

     public string Value
     {
         set { ViewState["val"] = value; } 
         get { return ViewState["val"].ToString(); }
     }

     protected void LnkBtnSort_Clicked(object sender, EventArgs e)
     {
         if( Click != null )
         {
             this.Click(this, EventArgs.Empty);
         }
     }
}

所以现在在转发器中你所要做的就是将该控件的一个实例绑定到Container.DataItem:

<ItemTemplate>
    <ctrl:SomeControl 
         ID="someControl" 
         runat="server" 
         OnClick="SomeControl_Clicked"
         ArrangeById='<%# Eval("arrange_by_id") %>'
         Value='<%# Eval("value") %>' /> 
</ItemTemplate>

具有转发器的页面/控件将有一个简单的方法:

protected void SomeControl_Clicked(object sender, EventArgs e)
{
    //Here cast the sender to the type of control you made:

    SomeControl ctrl = (SomeControl)sender;

    string byId = ctrl.ArrangeById;
    string val = ctrl.Value;
}

注意:此代码可能不是100%正确,但它说明了这一点。流程很简单 - 控件将其公共属性绑定到您需要绑定的任何内容。单击链接(在控件内)时,控件不会将此事件传播到页面。相反,它会触发自己的事件(Click),从而向页面发送一个事件发生的信号。但是通过这样做,它会将事件的来源更改为自身而不是实际的链接按钮。该页面处理事件,每个人都很高兴。

这样你就不必关心CommandArgument是什么了......如果这个空白,那就意味着你的数据源是空的......或者代码中发生了其他事情。