【问题标题】:Change row color of gridview by database Values通过数据库值更改gridview的行颜色
【发布时间】:2013-03-27 10:05:57
【问题描述】:

我正在 asp.net 中创建一个应用程序,它显示来自数据库的 gridview 中的值。在数据库中,我有一个名为 StatusId 的列,其值为 1 或 2 或 3。

我尝试通过它们的 statusId 值以不同的颜色显示网格视图行。但它永远不会奏效。我如何在 asp.net 中做到这一点。

这是我的代码

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {

        Connection.Open();
        SqlCommand Command1 = Connection.CreateCommand();
        Command1.CommandText = "Select statusColor from status where statusId=(Select statusId from fileInfo where userId=(Select userId from userInfo where email='" + Session["email"].ToString() + "'))";

        for (int i = 0; i < GridView1.Rows.Count; i++)
        {
            using (SqlDataReader reader = Command1.ExecuteReader())
            {
                while (reader.Read())
                {
                    statusId = reader["statusColor"].ToString();
                }
             GridView1.RowStyle.BackColor = Color.FromName(statusId);           
        } 
        }


        foreach (GridViewRow row in GridView1.Rows)
        {
            row.BackColor = Color.Green;
        }
        SqlCommand com = new SqlCommand("gridcolor", Connection);
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.AddWithValue("@statusId", statusId);
        com.Parameters.Add("@statusColor", SqlDbType.NVarChar, 30);
        com.Parameters["@statusColor"].Direction = ParameterDirection.Output;
        com.ExecuteNonQuery();
        string msg = (string)com.Parameters["@statusColor"].Value;
        Connection.Close();
    } 

我在这里做错了什么?

编辑

我有存储在名为 statusColor 的数据库中的颜色代码。我必须将这些颜色应用于这些状态。

【问题讨论】:

  • 为什么不将状态颜色作为网格绑定的数据的一部分返回呢?您当前的方法将导致对每一行进行数据库调用。
  • 是的,我认为这将是更改每行颜色的更好方法。

标签: asp.net gridview rowdatabound


【解决方案1】:
protected void grdMyQ_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            for (int i = 0; i < grdMyQ.Rows.Count; i++)
            {
                if (grdMyQ.Rows[i].Cells[13].Text.ToUpper() == "DISCHARGED_PROCESS")
                {
                    grdMyQ.Rows[i].BackColor = Color.Red;

                }
            }
        }

【讨论】:

    【解决方案2】:

    你做错了。您必须在页面加载或自定义事件(比如单击按钮)而不是 rowDataBound 事件上对您的 gridview 进行数据绑定。当您的行与数据绑定并且您想要更改每行的某些属性(如您的情况)时,会发生此事件。

    您可以使用 Gridview DataBound 事件通过以下方式分配颜色

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // Fetch status Id for current row
            int statusId= Convert.ToInt32(DataBinder.Eval(e.Row.DataItem,"UnitsInStock"));
    
            switch (statusId)
           {
             case (1):
                       e.Row.BackColor= System.Drawing.Color.Green;
                       break;
    
             // other cases follow the same
           }
    
        }
    }
    

    将数据绑定代码放在 pageLoad 或按钮单击事件中。

    【讨论】:

      【解决方案3】:

      您有 statusId 具有值 1,2,3 并且您传递给 Color.FromName 和 1,2,3 不是颜色的名称,您可以使用 switch 根据 statusId 分配不同的颜色.

      Color rowColor = Color.Red;    
      switch(statusId)
      {
          case 1:
               rowColor = Color.Green;
               break;
      
          case 2:
               rowColor = Color.White;
               break;
          case 3:
               rowColor = Color.Blue;
               break;
      }   
      GridView1.RowStyle.BackColor = rowColor ; 
      

      【讨论】:

      • statusId 会有什么值,它们仍然是问题中提到的 1,2,3?
      • 是的,我们可以从数据库中更改颜色值,而不是进入编码。
      • 那么你必须在 Color.FromName 中传递 Red、Green 等而不是 1,2,3 或者像我告诉你的那样使用它。
      • 此答案将所有行颜色设置为相同。
      • 如果 statusID 的数值为 1,2,3 那么它应该改变颜色,调试代码并检查什么情况下 switch 被执行
      猜你喜欢
      • 2011-10-09
      • 2015-01-04
      • 2017-10-08
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多