3

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

它抛出一个错误

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:

我哪里出错了,如何根据条件显示图像。我想我没有正确完成行数据绑定。请帮忙。

4

4 回答 4

2

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

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

更新: 既然您已经粘贴了 Grid 外观的实际图像,我认为 Joel Etherton 是对的,您正试图将 Date 解析为整数。Cell[1] (假设您在左侧没有任何不可见的列)是日期,而不是整数,因此当您尝试 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;
        }
    }
}
于 2011-09-12T14:04:20.147 回答
1

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

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 语句的表达式一次性完成了太多工作。我并不是说不可能实现,但它会产生很多灰色区域,以确定任何生成的错误来自何处。

于 2011-09-12T14:38:54.267 回答
1

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

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

<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 是为了回答这个问题。

于 2013-03-13T03:15:32.663 回答
0

我同意 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;
        }
于 2011-09-12T14:12:59.700 回答