根据条件在网格视图中显示图像

本文关键字:显示 显示图 图像 视图 网格 条件 | 更新日期: 2023-09-27 18:08:15

我正在尝试显示1. 如果timerreceived为Null,则为红色,(或)2. 当Time Received不为空且Time Read为空(或)时,琥珀色3.绿色Time read不为空

抛出错误

Input string was not in a correct format. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.FormatException: Input string was not in a correct format.
Source Error: 

Line 86:         {
Line 87:             Image img = (Image)e.Row.FindControl("image1");
Line 88:             switch (int.Parse(e.Row.Cells[1].Text))
Line 89:             {
Line 90:                 case 0:

在我出错的地方,我如何根据条件显示图像。我想我没有正确地做行绑定。请帮助。

根据条件在网格视图中显示图像

您可能正在尝试将null或空字符串解析为整型。将int.Parse行更改为:

switch (int.Parse(string.IsNullOrEmpty(e.Row.Cells[1].Text)?"0":e.Row.Cells[1].Text))

UPDATE:现在您已经粘贴了网格外观的实际图像,我认为Joel Etherton是对的,您正在尝试将日期解析为整数。单元格[1](假设左侧没有任何不可见的列)是一个Date,而不是整数,所以当您尝试int时。Parse抛出异常,因为它无法解析该异常。此外,根据您的条件,您的MyGrid_RowDataBound逻辑是不正确的。尝试将您的实现更改为此。

protected void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Image img = (Image)e.Row.FindControl("image1");
        //condition for red image; Neither TimeReceived and TimeRead are populated
        if(string.IsNullOrEmpty(e.Row.Cells[1].Text) &&  
           string.IsNullOrEmpty(e.Row.Cells[2].Text))
        {
            img.ImageUrl = "/images/Red.gif";
            img.Visible = true;
        }
        //condition for amber image; TimeReceived not null and TimeRead is null
        else if (!string.IsNullOrEmpty(e.Row.Cells[1].Text) &&  
                 string.IsNullOrEmpty(e.Row.Cells[2].Text))
        {
            img.ImageUrl = "/images/Amber.gif";
            img.Visible = true;
        }
        //condition for green image; TimeReceived not null and TimeRead not null
        else if (!string.IsNullOrEmpty(e.Row.Cells[1].Text) &&  
                 !string.IsNullOrEmpty(e.Row.Cells[2].Text))
        {
           img.ImageUrl = "/images/Green.gif";
           img.Visible = true;
        }
        else //default case
        {
            img.Visible = false;
        }
    }
}

这就是我看到问题发生的地方,坦率地说,这段代码有点乱。

switch(int.Parse(string.IsNullOrEmpty(e.Row.Cells[1].Text)?"0":e.Row.Cells[1].Text))

这里有太多有用的东西。首先,e.Row。Cells[1]看起来像是提供了一个DateTime,所以int。在这里使用Parse绝对是错误的。根据你对你想要的东西的描述,我看不出这将如何以任何方式实现。

这是我的尝试:

Image img = (Image)e.Row.FindControl("image1");
DateTime received;
DateTime read;
DateTime.TryParse(e.Row.Cells[1].Text, received);   // If exception it will produce DateTime.MinValue
DateTime.TryParse(e.Row.Cells[2].Text, read);
if (received == DateTime.MinValue)
{
    img.ImageUrl = "/images/Red.gif";
}
else if (read == DateTime.MinValue)
{
    img.ImageUrl = "/images/Amber.gif";
}
else
{
    img.ImageUrl = "/images/Green.gif";
}
img.Visible = true;

在适当的时候使用if语句。你要做的事情涉及到日期,所以使用日期。简化表达式,使其更具可读性。你不必在一行中做所有的事情。传递给switch语句的表达式在一次执行的操作太多了。我并不是说这是不可能实现的,但它会产生很多灰色地带,关于任何生成的错误来自哪里。

我很难理解这些复杂的解决方案,所以我做了一些研究,这是我的解决方案。我把它留在这里,希望它能帮助到别人

我像这样改变了我的网格代码

<asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false" OnRowCommand="RowCommand">
    <Columns>
        <asp:TemplateField HeaderText="Commands">
            <ItemTemplate><asp:ImageButton ID="btnDelete" Visible='<%# ActionPermitted("DELETE") %>' runat="server" ImageUrl="images/bin.png" ToolTip="Delete" CommandName="Delete" CommandArgument='<%# Eval("Id")%>' /></ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ASPImage">
            <ItemTemplate><asp:Image runat="server" ID="rowImage" ImageUrl='<%# ImageView(((System.Data.DataRowView) Container.DataItem).Row)%>' /></ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="HTMLImage">
            <ItemTemplate><img src='<%# ImageView(((System.Data.DataRowView) Container.DataItem).Row)%>' /></ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="SetVisible">
            <ItemTemplate>
                <img src="green.gif" style='display:<%# Eval("aColumn") == "Value1"? "inline":"none" %>' />
                <img src="red.gif" style='display:<%# Eval("aColumn") == "Value2"? "none":"inline" %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

在我的代码后面,我有以下函数

protected boolean ActionPermitted(string action){
  return (action=="Delete" || user == "admin");
}
protected string ImageView(DataRow row){
    if (row["SomeData"] == DBNull.Value){
        return "red.gif";
    } else if (row["SomeData"] != DBNull.Value && row["SomeOtherData"] == DBNull.Value){
        return "amber.gif";
    } else {
        return "green.gif";
    }
}

请注意,这实际上是4种不同的解决方案。

  • 根据代码隐藏函数返回的值改变asp按钮的可见性(注意单引号而不是双引号)
  • 将当前DataRow传递给后面的代码并基于该
  • 返回结果
  • 更改HTML标签的属性(可用于将代码生成的数据插入到列中)
  • 显示/隐藏HTML图像(可以是任何标签)

最后一个TemplateField是用来回答这个问题的

我同意Icarus,但如果你使用int会更好。TryParse代替int.Parse.

Image img = (Image)e.Row.FindControl("image1");
int val = 0;
int.TryParse(e.Row.Cells[1].Text , out val);
        switch (int.Parse(e.Row.Cells[1].Text))
        {
            case 0:
                img.ImageUrl = "/images/Red.gif";
                img.Visible = true;
                break;
            case 1:
                img.ImageUrl = "/images/Amber.gif";
                img.Visible = true;
                break;
            case 2:
                img.ImageUrl = "/images/Green.gif";
                img.Visible = true;
                break;               
            default:
                img.Visible = false;
                break;
        }