Проблемы с выпадающим списком в поле шаблона в gridview

Итак, у меня есть gridview, как показано в следующем html:

 <asp:GridView ID="gridDetaljiNarudzbe" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" runat="server" OnRowCommand="gridDetaljiNarudzbe_RowCommand" OnPageIndexChanging="gridDetaljiNarudzbe_PageIndexChanging" OnRowDataBound="gridDetaljiNarudzbe_RowDataBound">
        <Columns>
           <asp:BoundField DataField="Naziv" HeaderText="Naziv" />
           <asp:BoundField DataField="Sifra" HeaderText="Šifra" />
           <asp:BoundField DataField="Cijena" HeaderText="Cijena" />
           <asp:BoundField DataField="Kolicina" HeaderText="Količina" />
                <asp:TemplateField HeaderText="Ocjena">
                <ItemTemplate>
                    <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
                </ItemTemplate>
            </asp:TemplateField>
          <asp:TemplateField>
              <ItemTemplate> 
                  <asp:LinkButton ID="btnOcijeni" title="Ocijeni proizvod" CommandName="OcijeniCommand" CommandArgument='<%# Eval("ProizvodID") %>' runat="server"><img src="../images/ocijeni.png" /></asp:LinkButton>
              </ItemTemplate>
          </asp:TemplateField>
        </Columns>
    </asp:GridView>

Для заполнения выпадающего списка для каждой записи в БД я использовал следующий код (событие RowDataBound):

if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DropDownList drop = e.Row.FindControl("DropDownList1") as DropDownList;
                drop.Items.Add(new ListItem(""));
                drop.Items.Add(new ListItem("1"));
                drop.Items.Add(new ListItem("2"));
                drop.Items.Add(new ListItem("3"));
                drop.Items.Add(new ListItem("4"));
                drop.Items.Add(new ListItem("5"));
            }

Для выбора значения из выпадающего списка в каждой строке:

   foreach (GridViewRow gr in gridDetaljiNarudzbe.Rows)
{
                        DropDownList drop = gr.FindControl("DropDownList1") as DropDownList;
                     // now selecting a value from dropdownlist 
                 int selectednumber = Convert.ToInt32(drop.Text);
}

Теперь моя проблема заключается в том, что у нас есть две записи в сетке, и я хотел бы выбрать значение из второго раскрывающегося списка во 2-й строке (допустим, я сделал это). И когда я нажимаю кнопку первой записи в первой строке, то значение, которое я взял из 2-го выпадающего списка, теперь вставляется в БД, как если бы я выбрал что-то из первого выпадающего списка.

Также я хотел бы знать, возможно ли после того, как что-то было выбрано в выпадающем списке и вставлено в БД, отключить теперь этот раскрывающийся список и превратить его в статический текст, который будет отображать только 5 вместо раскрывающегося списка?

Может кто-нибудь помочь мне с этим, пожалуйста? Я пробовал все, но я еще не преуспел. :/

РЕДАКТИРОВАТЬ:

Когда я выбираю что-то из второй сетки (2-й раскрывающийся список, как вы можете видеть на картинке) и когда я нажимаю кнопку, чтобы оценить первый продукт, я получаю оценку из 2-го раскрывающегося списка, который я выбрал. Теперь стало понятнее?

Проблема

Спасибо!

Отредактируйте вот код для йога:

   List<hsp_Proizvodi_SprijeciDvaPutaOcijeniti_Result> lista = ServisnaKlasa.SprijeciDvostrukoOcjenjivanje(ProizvodID, Sesija.kupac.KupacID);
                foreach (GridViewRow gr in gridDetaljiNarudzbe.Rows)
                {
                    if (lista.Count == 0)
                    {
                        DropDownList drop = gr.FindControl("DropDownList1") as DropDownList;
                        if (drop.SelectedIndex != 0)
                        {
                            Ocjene o = new Ocjene();
                            o.KupacID = Sesija.kupac.KupacID;
                            o.ProizvodID = ProizvodID;
                            o.Datum = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                            o.Ocjena = Convert.ToInt32(drop.Text);
                            ServisnaKlasa.OcjenjivanjeProizvoda(o);
                            string poruka = "Proizvod uspješno ocijenjen!";
                            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + poruka + "');", true);
                            drop.SelectedIndex = 0;

                        }
                    }
                    else
                    {
                        string poruka = "Ovaj proizvod ste već ocijenili!";
                        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + poruka + "');", true);
                    }
                }

person perkes456    schedule 19.11.2014    source источник
comment
какова связь между первой строкой и второй строкой. ты не так уж и ясен. что вы хотите и в чем проблема, можете ли вы это прояснить?   -  person yogi970    schedule 19.11.2014
comment
Вы видите эту картинку: oi59.tinypic.com/2s0k4k9.jpg Когда я выбираю что-то из вторая сетка (2-й раскрывающийся список, как вы можете видеть на картинке), и когда я нажимаю кнопку, чтобы оценить первый продукт, я получаю оценку из 2-го раскрывающегося списка, который я выбрал. Теперь стало понятнее?   -  person perkes456    schedule 19.11.2014
comment
жаль не могу посмотреть эту картинку. можно отредактировать свой вопрос?   -  person yogi970    schedule 19.11.2014
comment
вы просто говорите, что происходит не то, что вы хотите! Вы хотите перестать получать оценки из второго раскрывающегося списка?   -  person yogi970    schedule 19.11.2014
comment
Нет, это не так, пожалуйста, посмотрите на картинку в обновленном вопросе. P.S. надеюсь теперь понятнее   -  person perkes456    schedule 19.11.2014
comment
я понимаю, что если кто-то ничего не выбрал в первом раскрывающемся списке и выбрал 3 во втором раскрывающемся списке, и он нажимает кнопку первой строки, эта вторая строка «3» должна быть вставлена ​​с данными первой строки. я получаю правильно?   -  person yogi970    schedule 19.11.2014
comment
Да, именно так, можно ли как-то предотвратить это?   -  person perkes456    schedule 19.11.2014
comment
можете ли вы показать полный код, в котором вы вставляете значения в db.?   -  person yogi970    schedule 19.11.2014
comment
Я добавил код выше, пожалуйста, обратитесь к нему. Спасибо ! :)   -  person perkes456    schedule 19.11.2014


Ответы (1)


Следуйте этому подходу

  1. добавить событие RowCommand gridview.
  2. Укажите командный аргумент для кнопки ссылки. Вот так

    <asp:LinkButton ID="btnOcijeni" title="Ocijeni proizvod" CommandName="OcijeniCommand" CommandArgument='<%#Eval("ProizvodID") + ";" +((GridViewRow) Container).RowIndex%>' runat="server"><img src="../images/ocijeni.png" /></asp:LinkButton>
    

(я только что добавил еще одно поле в аргумент команды для rowindex)

  1. теперь, когда бы вы ни нажали на кнопку ссылки, будет вызвано событие RowCommand.

    protected void gridDetaljiNarudzbe_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "OcijeniCommand") { arg = e.CommandArgument.ToString().Split(';'); int index = Convert.ToInt32(arg[1].ToString()); //Finding same row dropdown list //This will give you same row dropdownlist not the below row DropDownList drpdwn1= (DropDownList)gridDetaljiNarudzbe.Rows[index].FindControl("DropDownList1");
    //Now for BoundField values GridViewRow row = GridView1.Rows[index]; string NazivText= row.Cells[0].Text;//It will give Naziv's value //same way you can get other field values //And save into db. } }

Изменить

Для преобразования выпадающего списка в ярлык

  1. Добавьте ярлык под раскрывающимся списком и сделайте его Visible=false

     <ItemTemplate>
                    <asp:DropDownList ID="DropDownList1" runat="server"></asp:DropDownList>
                    <asp:Label ID="lbl_ForDrpdwnVal" runat="server"  Visible="false"></asp:Label>               
    

  2. Now in the same item command event add the below code after inserting values to db.

                        //Access the new label
                        Label lblfordrpdwn= (Label)gridDetaljiNarudzbe.Rows[index].FindControl("lbl_ForDrpdwnVal");
                        lblfordrpdwn.Text= drpdwn1.SelectedItem.Text;//Setting value from dropdown to lbel
                        lblfordrpdwn.Visible=true;//Showing label
                        drpdwn1.Visible=false;//Hiding the dropdown
    
person yogi970    schedule 19.11.2014
comment
Чувак ты лучший, это работает!!! Не могли бы вы помочь мне еще с одной вещью? Теперь, когда что-то было вставлено в БД (для определенной строки), я хотел бы показать метку в сетке, показывающую оценку (1,2,3,4,5) вместо раскрывающегося списка для этой определенной строки для какая оценка была вставлена? - person perkes456; 19.11.2014
comment
Я рад, что это помогает вам. :) вы хотите заменить выпадающий список меткой после вставки значения в базу данных? - person yogi970; 20.11.2014
comment
@ perkes456 смотрите правку. надеюсь, это решит вашу проблему - person yogi970; 20.11.2014
comment
Да, йог, спасибо, у меня, к сожалению, другая проблема :(. Когда 1 пользователь оценивает 3 продукта, скажем, а другой пользователь приходит и покупает все 3 одинаковых продукта, и теперь, когда он пытается их оценить, выпадающий список больше не отображается, но просто метка самой оценки (а не выпадающий список для оценки продуктов).Есть ли способ, которым я могу выбить оценки от 1-го парня для 2-го парня, чтобы он мог ввести свои собственные оценки? - person perkes456; 20.11.2014
comment
вы храните оценки для каждого пользователя отдельно? - person yogi970; 20.11.2014
comment
Да, но хранимая процедура у меня совсем нехорошая... Может быть, вы могли бы мне помочь? Я собираюсь задать новый вопрос по этому поводу, поэтому я надеюсь, что вы будете там, чтобы помочь :) - person perkes456; 20.11.2014
comment
Давайте продолжим обсуждение в чате. - person perkes456; 20.11.2014
comment
Yogi Сейчас вроде работает, но у меня другая проблема, не мог бы ты зайти поболтать, пожалуйста? - person perkes456; 20.11.2014
comment
Я реализовал это, как вы мне сказали, и теперь, когда я оцениваю все 3 продукта с пользователем 1, я вхожу в систему с пользователем 2 и начинаю оценивать, он успешно оценивается с пользователем 2, но теперь он показывает двойные столбцы (он также показывает пользователя рейтинги от пользователя 1)?? :/ - person perkes456; 20.11.2014
comment
@ perkes456 опять же, это то же самое, что вы связываете со всеми пользовательскими данными, просто связываете только с текущими пользовательскими данными. добавьте то же предложение where с текущим сеансом пользователя, как вы добавили в этом запросе - person yogi970; 21.11.2014
comment
Еще одна проблема теперь, когда я добавляю и o.BuyerID=@BuyerID (из моего сеанса), теперь он показывает оценки покупателей, но если покупатель не оценил какой-либо продукт, теперь сетка вообще не отображается? :( - person perkes456; 21.11.2014