Передача двух значений через CommandArgument и разбиение его - PullRequest
0 голосов
/ 07 декабря 2010

Я использую свойство commandArgument LinkButton (которое обернуто внутри повторителя), чтобы передать два значения - как одну строку - второму повторителю, затем я пытаюсь разделить их на два значения, так что я мог бы использовать их какпараметры в моем коде ADO.NET (параметры SqlCommand) .... после тестирования мои запросы не возвращают никаких результатов, но если я передал фиксированные значения для параметра или изменил источник параметра (только для проверки из текстового поля или строки запросаили что-то еще) Я получаю свои результаты, поэтому я думаю, что проблема в разделении.

Я провожу некоторые значения arugment из свойства ArgumentCommand объекта LinkButton, который заключен в повторитель:

   <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 Ответ

1 голос
/ 08 декабря 2010

Вот простое решение:

Оберните шаблон элемента для повторителя в элемент управления.Элемент управления будет иметь ту же разметку, что и шаблон вашего элемента без привязок:

Элемент управления Разметка:

<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 ... Если он пуст, это означает, что любой ваш источник данных пуст ...или что-то еще произошло в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...