【问题标题】:Show a button based on the value of a field in SQL database根据 SQL 数据库中字段的值显示按钮
【发布时间】:2017-01-06 21:29:43
【问题描述】:

我有两个按钮(btn_Out 和 btn_In)。如果名为 Machines 的 SQL 表中字段 Active 的值为 True (1),我想显示 btn_Out,如果 Active 的值则显示 btn_In > 设置为假 (0)。

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 语句中使用了按钮并且无法编译!任何提示将不胜感激:)

【问题讨论】:

  • 您遇到的错误是什么?你能不能把完整的代码,方法名称和所有。
  • 你的代码在哪里?您必须在 PageLoad 上执行此操作。
  • 您需要熟悉 PostBacks 和 Rendering 的工作原理。您还需要在 C# 代码中获取按钮的属性才能执行此操作,该代码位于该代码所在的哪个事件后面...?
  • 您应该从 sql-server 获得异常,因为您使用 @Serial_Number 作为参数名称,但它实际上是 @SerialNumber。你有一个Try...Catch{//ignore} 可以吞下这个异常吗?
  • 我认为你的方法不对,如果你使用foreach的这段代码,你就是在攻击服务器。我说foreach,因为你需要它来访问buttons

标签: c# sql asp.net gridview


【解决方案1】:

我有两个按钮(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;
        }
    }
}

【讨论】:

    【解决方案2】:

    动态更改 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;
            }
        }
        }
    

    【讨论】:

      【解决方案3】:

      为什么不直接在按钮中设置可见性?那你就不需要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" %>'
      

      【讨论】:

      • 谢谢 - 我发现这是最简单快捷的方法,无需更改大量代码!
      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      相关资源
      最近更新 更多