2016-08-30 3 views
-1

У меня есть две кнопки (btn_Out и btn_In). Я хочу отобразить btn_Out, если значение поля Active в таблице SQL с именем Машины - это True (1) и отображение btn_In, если значение Active установлено в False (0).Показать кнопку, основанную на значении поля в базе данных SQL

Каждая строка в данных в gridview может иметь другой флаг Active, поэтому кнопка должна отражать это. Кнопка изменит активный флаг с 0 на 1 и наоборот (у меня это работает!).

Я использую GridView и мой код выглядит следующим образом:

ASP.NET

<ItemTemplate> 
    <asp:Button ID="btn_In" runat="server" Text="Set in Scope" CommandName="Update" CssClass="Button" /> 
</ItemTemplate> 
<ItemTemplate> 
    <asp:Button ID="btn_Out" runat="server" Text="Set in Scope" CommandName="Update" CssClass="Button" /> 
</ItemTemplate> 

C#:

DataTable dt = new DataTable(); 
using (SqlDataAdapter sda = new SqlDataAdapter(cmd)) 
{   
    sda.Fill(dt); 
    GridView1.DataSource = dt; 
    GridView1.DataBind(); 
    con.Open(); 
    con = new SqlConnection(cs); 
    // SqlCommand cmd = new SqlCommand(); 
    cmd.CommandText = "select [active] from [ALLMACHINES].[dbo].[Machines] where [serial_number] = @serialNumber"; 
    cmd.Parameters.AddWithValue("@Serial_Number", serialNumber); 
    int Active = Convert.ToInt32(cmd.ExecuteScalar()); 

    if (Active == 1) 
    { 
     btn_In.Visible = false; 
     btn_Out.Visible = true; 
    } 
    else if (Active == 0) 
    { 
     btn_Out.Visible = false; 
     btn_In.Visible = true; 
    } 
} 

Моя страница aspx.net не нравится, что я «Я использовал кнопки в выражении if и else if и не компилирую! Любые советы были бы очень благодарны :)

+0

Какая ошибка вы получаете? Canyou поставил полный код, с именами методов и всеми. –

+0

Где ваш код? Вы должны сделать это на странице Load. –

+0

вам нужно знать, как работают PostBacks и Rendering .. вам нужно получить атрибуты кнопки, чтобы сделать это также в коде C#, за тем, в каком событии находится этот код ..? – MethodMan

ответ

1

Почему бы не установить видимость непосредственно в кнопках? Тогда вам не нужно OnRowDataBound

<asp:Button ID="btn_In" Visible='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Active")) == true %>' Text="Set in Scope" CommandName="Update" CssClass="Button" runat="server" /> 

<asp:Button ID="btn_Out" Visible='<%# Convert.ToBoolean(DataBinder.Eval(Container.DataItem, "Active")) == false %>' runat="server" Text="Set in Scope" CommandName="Update" CssClass="Button" /> 

Также работает со строками и т.д., если ваш флаг не является булевой.

Visible='<%# DataBinder.Eval(Container.DataItem, "Active").ToString() == "1" %>' 
+0

Спасибо - я обнаружил, что это был самый простой и быстрый способ сделать это, не меняя много кода! – akb29

0

У меня есть две кнопки (btn_Out и btn_In).

У вас есть 2 кнопки в каждый строк, и каждая строка может иметь другое значение, то есть вы не можете выбрать это значение только один раз, как вы делали в вашем коде. Вместо этого, читайте о RowDataBound события (MSDN, How to find control in TemplateField of GridView? и т.д.), чтобы избавиться от вашего текущего кода и сделать что-то подобное этому

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Retrieve the underlying data item. In this example 
     // the underlying data item is a DataRowView object. 
     DataRowView rowView = (DataRowView)e.Row.DataItem; 

     // Retrieve the state value for the current row. 
     String flag = rowView["active"].ToString(); 

     Button btn_Out = e.Row.FindControl("btn_Out") as Button; 
     Button btn_In = e.Row.FindControl("btn_In") as Button; 

     if (flag == "1") { 
      btn_In.Visible = false; 
      btn_Out.Visible = true; 
     } else { 
      btn_In.Visible = false; 
      btn_Out.Visible = true; 
     } 
    } 
} 
+0

Спасибо!Это логично имеет смысл для меня, но поскольку я ограничен вовремя, у меня не было возможности полностью разобраться, но сохранено для дальнейшего использования !! :) – akb29

1

Лучший метод для динамического изменения значения GridView клеток является onrowdatabound событие. Может следующий код помочь вам:

страницы ASPX

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound"> 
       <Columns> 
        <asp:TemplateField> 
<ItemTemplate> 
    <asp:Lable ID="lblstus" runat="server" Text="#Eval("active")" Visible=false> 
</ItemTemplate> 
       ... otherfields you wanted to add 
<asp:TemplateField> 
<ItemTemplate> 
    <asp:Button ID="btn_In" runat="server" Text="Set in Scope" CommandName="Update" CssClass="Button" /> 
<asp:Button ID="btn_Out" runat="server" Text="Set in Scope" CommandName="Update" CssClass="Button" /> 
</ItemTemplate> 
</asp:TemplateField> 
       </Columns> 
      </asp:GridView> 

код-за:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if(e.Row.RowType == DataControlRowType.DataRow) 
     { 
      Lable lblstus = e.Row.FindControl("lblstus") as Lable; 
      Button btn_Out = e.Row.FindControl("btn_Out") as Button; 
     Button btn_In = e.Row.FindControl("btn_In") as Button; 
      if(lblstus.Text == "1") 
      { 
btn_In.Visible = false; 
      btn_Out.Visible = true; 
     } else { 
      btn_In.Visible = false; 
      btn_Out.Visible = true; 
     } 
    } 
    } 
+0

Спасибо! Это логично имеет смысл для меня, но поскольку я ограничен вовремя, у меня не было возможности полностью разобраться, но сохранено для дальнейшего использования !! :) – akb29

Смежные вопросы