2010-12-07 4 views
0

LinkBut​​tonのcommandArgumentプロパティ(リピータ内で折り返されている)を使用して2つの値を1つの文字列として2番目のリピータに渡してから2つに分割しようとしています値、私は私のADO.NETコード(SqlCommandのパラメータ)のパラメータとしてそれらを使用することができます....私のクエリをテストした後に結果を返しませんが、私はパラメータの固定値を渡した場合、テキストボックスやクエリ文字列などのテストのために)私は結果を得ているので、問題は分裂していると思います。CommandArgumentで2つの値を渡して分割する

私は、リピータ内にラップされ-whichの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(); 
          } 
         } 
        } 
+0

sortByAndArrangeByArrayでは実際にどのような値が得られますか?あなたはそれらをチェックしましたか? –

+0

yh、私は期待していた正確な値を得る!パラメータのリソースとしては価値がありません。 sortByAndArrangeByArray [0]は1から3の数字を返します sortByAndArrangeByArray [1]はアルファベットの文字を含む文字を返します – lKashef

答えて

1

Hとしてこの値を使用し

リピータ用のアイテムテンプレートをコントロール内にラップします。あなたがしなければならないすべてはあるリピータで、今ので

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); 
     } 
    } 
} 

制御マークアップ:

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

制御コードコントロールがバインドせずに、あなたの項目テンプレートと同じマークアップを持っていますそのコントロールのインスタンスをContainer.DataItemにバインドします。

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

ページ/コントロールt帽子は、リピーターが簡単な方法を持っています:

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が何であるか気にする必要はありません。これが空になると、データソースが空であるか、コード内で何かが発生したことを意味します。

+0

なぜローカル変数の代わりにプロパティでViewStateを使用しましたか? btw私の例はすでに動作していますが、分割することで何かがあります。 – lKashef

+0

btw、ちょうどLnkBtnSort_Clickedメソッドの機能は何ですか? – lKashef

+0

答えとしてマークされているので、少なくとも一般的に私の場合には可能な解決策です!ありがとう=) – lKashef