Кнопка включения/отключения в Gridview для каждой строки

У меня есть GridView, в котором есть Like и Dislike Button в каждом Row.

Что я хочу сделать, так это чтобы пользователь мог click только один из тех на Row и Enable или Disable, что Button на row, когда этот конкретный Button равен clicked.

У меня есть Sql Table tblVote, у которого есть Field с Name Vote. Это сохраняет подсчет для пользователя, если у него есть voted для этого элемента. Если пользователь clicks Dislike Button для первой записи, он запишет 0 в Vote Column под itemId 1. Если пользователь clicks на Like, он напишет 1 и так далее для каждой записи. У меня эта часть уже работает. Как я могу прочитать из table и выдать Button это состояние в зависимости от value на Vote Field на tblVote.

Table:

ItemId  | UserID  |  Vote

 1      |   123   |   0

 2      |   123   |   1



<asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333"
  GridLines="None" AutoGenerateColumns="False" DataKeyNames="SwotItemID" AllowPaging="True"
  AllowSorting="True" DataSourceID="SqlDataSource1" OnRowCommand="GridViewStrength_RowCommand"
  Width="100%" onrowdatabound="GridView1_RowDataBound">
    <AlternatingRowStyle BackColor="White" />
      <Columns>
         <asp:BoundField DataField="ItemDesc" HeaderText="Item Description" SortExpression="ItemDesc">
            <ItemStyle HorizontalAlign="Left" />
         </asp:BoundField>
         <asp:TemplateField HeaderText="Like" InsertVisible="False" SortExpression="Vote">
            <ItemTemplate>
               <asp:Button ID="Btn_thumbs_up" runat="server" Text = "Like"
                    CommandName="VoteUp" CommandArgument='<%# Bind("SwotItemID") %>' />
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
         </asp:TemplateField>
         <asp:TemplateField HeaderText="Dislike" InsertVisible="False" SortExpression="Vote">
            <ItemTemplate>
               <asp:Button ID="Btn_thumbs_down" runat="server" Text = "Dislike"
                    CommandName="VoteDown" CommandArgument='<%# Bind("SwotItemID") %>' />
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
         </asp:TemplateField>
      </Columns>
      <FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
      <PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
      <RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
      <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
      <SortedAscendingCellStyle BackColor="#FDF5AC" />
      <SortedAscendingHeaderStyle BackColor="#4D0000" />
      <SortedDescendingCellStyle BackColor="#FCF6C0" />
      <SortedDescendingHeaderStyle BackColor="#820000" />
</asp:GridView>

person Apollo    schedule 12.03.2014    source источник
comment
возможный дубликат включить и отключить кнопку ссылки в представлении сетки   -  person Malachi    schedule 19.08.2015


Ответы (1)


Я думаю, вы сможете сделать это с помощью цикла foreach. Вы можете сделать что-то вроде ..

string vote;

//Your connection string. You don't want to open and close within the foreach because it will open and close for each row. Not ideal
conn.Open();

foreach(GridViewRow gvr in GridView1.Rows)
{
    //you'll want to find the buttons
    Button voteUp = ((Button)gvr.FindControl("Btn_thumbs_up"));
    Button voteDown = ((Button)gvr.FindControl("Btn_thumbs_down"));
    Label SwotItemID = ((Label)gvr.FindControl("SwotItemID));//I would add SwotItemID as a templatefield with an asp label in it in your gridview

    SqlCommand cmdSelectVote= new SqlCommand("SELECT ThumpUpColumn FROM tLoveOrHateTable WHERE SwotItemID = '" + SwotItemID + "'", conn);
    vote = Convert.ToString(cmdSelectVote.ExecuteScalar());


    if(vote == "0")
    {
       voteDown.Enabled = false;
    }
    else if (vote == "1")
    {
       voteUp.Enabled = true;
    }
}
conn.Close();

Я бы тогда на загрузку страницы или кнопку или что-то. Независимо от того, что заполняет ваши данные. Это то, что я бы попробовал сначала, а затем ушел оттуда. Итак, что он делает, так это запускает этот оператор sql для каждой строки. Если это 0, то это отключает кнопку "палец вниз". Если это 1, то кнопка «большой палец вверх» будет отключена. Он будет идти строка за строкой, поэтому, если у вас есть 1000 строк (я не думаю, что вы это делаете), это может замедлить работу. Не держите меня в том, что он сразу заработает, так как я его не проверял и написал в коробке. Надеюсь это поможет!

person Humpy    schedule 12.03.2014
comment
я должен добавить это в rowdatabound - person Apollo; 17.03.2014
comment
Вы можете попробовать это и посмотреть, работает ли это. Вы также можете просто поместить его в собственный метод и вызвать его при загрузке страницы. - person Humpy; 17.03.2014