繁体   English   中英

Gridview 单元格颜色需要根据在 asp.net/c# 中检查的 CheckBox 更改# 不断出现错误

[英]Gridview Cell Color needs to change based on CheckBox checked in asp.net/c# keep getting errors

我有一个 Gridview (ASP.NET / C#),它当前根据用户提供的日期改变颜色。 逾期为红色,未来或当前日期为白色(效果很好。)。 我还在 gridview 单元格中提供了一个复选框,指定“完成”,如果该复选框被选中。 我希望它覆盖和日期并将单元格颜色更改为黑色,到目前为止,我一直遇到的错误是,当我在“RowDataBound”下或现在使用当前代码尝试它时,object 未设置为 object 的实例。 我已经尝试将它放在“OnCheckedChanged”下,这现在已经阻止了对复选框的任何更改。
数据以 Bit 的形式存储在数据库中。 更新命令将参数设置为 Boolean。

关于如何让它发挥作用的任何想法?

ASP.NET 标记:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1"
     GridView1_RowUpdating="true" DataKeyNames="ID" OnRowUpdating="Page_Load"
     BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid"
     BorderWidth="3px" CellPadding="4" CellSpacing="2" ForeColor="Black"
     OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:TemplateField HeaderText="Verify Info Prod & Maturity Level" SortExpression="IPMaturity">
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("IPMaturity", "{0:MM/dd/yyyy}") %>' Width="75"></asp:TextBox>
                <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" Text="Complete" Enabled="false" OnCheckedChanged="CheckBox1_CheckedChanged" 
                     Checked='<%# Bind ("CheckBox1") %>'></asp:CheckBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblIPMat" runat="server" Text='<%# Eval("IPMaturity", "{0:MM/dd/yyyy}") %>' Width="75"></asp:Label>
            </ItemTemplate>
            <HeaderStyle CssClass="verticaltext" Height="140px" Width="88px" HorizontalAlign="Center" VerticalAlign="Bottom" />
        </asp:TemplateField>

C#代码后面:

protected void CheckBox1_CheckedChanged(object sender, EventArgs e) //from checkbox
{
     CheckBox chkItem = null;
     //Boolean chkb = Convert.ToBoolean(DataBinder.Eval(e.Row.DataItem, "CheckBox1"));

     foreach (GridViewRow grRow in GridView1.Rows)
     {
         if (grRow.RowType == DataControlRowType.DataRow)
         {
             chkItem = (CheckBox)grRow.Cells[4].FindControl("CheckBox1");
             bool bl = chkItem.Checked;

             if (bl == true)
             {
                 grRow.BackColor = Color.Black;
             }
         }
    }
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)  // Changes color of cell based on date
    {
        string ipMaturity = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "IPMaturity"));
        DateTime? date1 = !string.IsNullOrEmpty(ipMaturity) ? Convert.ToDateTime(ipMaturity) : (DateTime?)null;

        if (date1.HasValue && date1 >= DateTime.Now)
            e.Row.Cells[4].BackColor = System.Drawing.Color.White;

        if (date1.HasValue && date1 < DateTime.Now)
            e.Row.Cells[4].BackColor = System.Drawing.Color.Red;
    }
}

尽可能多地保留您的代码,我做了一个简单的示例来显示复选框更改背景颜色。

需要指出的是,上面的代码示例没有Cells[4] (所以我只是用 0)。 我已经用 class ( IPMaturityData ) 和硬编码数据替换了 SQL 调用。 没有调用启用EditItemTemplate ,所以我继续添加<asp:CommandField ShowEditButton="True" />

该代码不会为您提供所需的一切。 然而,它应该足以玩弄它并让它按需要工作。

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    GridView1_RowUpdating="true" DataKeyNames="ID" OnRowUpdating="Page_Load"
    BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid"
    BorderWidth="3px" CellPadding="4" CellSpacing="2" ForeColor="Black"
    OnRowEditing="GridView1_RowEditing"
    OnRowDataBound="GridView1_RowDataBound">
    <Columns>
        <asp:TemplateField>
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("IPMaturity", "{0:MM/dd/yyyy}") %>' Width="75"></asp:TextBox>
                <asp:CheckBox ID="CheckBox1" 
                    runat="server" 
                    AutoPostBack="true"
                    Text="Complete"
                    OnCheckedChanged="CheckBox1_CheckedChanged" 
                    Checked='<%# Bind ("CheckBox1") %>'></asp:CheckBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="lblIPMat" runat="server" Text='<%# Eval("IPMaturity", "{0:MM/dd/yyyy}") %>' Width="75"></asp:Label>

            </ItemTemplate>
            <HeaderStyle CssClass="verticaltext" Height="140px" Width="88px" HorizontalAlign="Center" VerticalAlign="Bottom" />
        </asp:TemplateField>
        <asp:CommandField ShowEditButton="True" />
    </Columns>
</asp:GridView>

后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        this.DataBindGrid();
    }
}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView grid = sender as GridView;

    if (grid == null)
    {
        return;
    }

    grid.EditIndex = e.NewEditIndex;
    this.DataBindGrid();
}
  
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)  // Changes color of cell based on date
    {
        string ipMaturity = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "IPMaturity"));
        DateTime? date1 = !string.IsNullOrEmpty(ipMaturity) ? Convert.ToDateTime(ipMaturity) : (DateTime?)null;

        if (date1.HasValue && date1 >= DateTime.Now)
            e.Row.Cells[0].BackColor = System.Drawing.Color.White; // Theres no cell 4

        if (date1.HasValue && date1 < DateTime.Now)
            e.Row.Cells[0].BackColor = System.Drawing.Color.Red;
    }
}

protected void CheckBox1_CheckedChanged(object sender, EventArgs e) //from checkbox
{
    foreach (GridViewRow grRow in GridView1.Rows)
    {
        if (grRow.RowType == DataControlRowType.DataRow)
        {
            CheckBox chkItem = (CheckBox)sender;
            // chkItem = (CheckBox)grRow.Cells[4].FindControl("CheckBox1"); // This would work if cell 4 has a CheckBox

            if (chkItem.Checked)
            {
                grRow.BackColor = Color.Black;
            }
        }
    }
}

private void DataBindGrid()
{
    var x = new List<IPMaturityData>();
    x.Add(new IPMaturityData() { ID = 1, IPMaturity = DateTime.Now.AddDays(-1) });
    x.Add(new IPMaturityData() { ID = 2, IPMaturity = DateTime.Now.AddDays(1) });
    GridView1.DataSource = x;
    GridView1.DataBind();
}

public class IPMaturityData
{
    public int ID { get; set; }

    public DateTime IPMaturity { get; set; }

    public bool CheckBox1 { get; set; } // This looks wrong, but on html it has "Checked='<%# Bind ("CheckBox1") %>"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM