Отображение изображения в виде сетки на основе условия - PullRequest
3 голосов
/ 12 сентября 2011

Я пытаюсь отобразить 1. Красный, если значение TimeReceived равно нулю, (или) 2. Желтый, когда полученное время не равно нулю, а время считывания равно нулю (или) 3. Зеленый, когда время считывания не равно нулю

Выдает ошибку

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 ]

2 голосов
/ 12 сентября 2011

Вы, вероятно, пытаетесь проанализировать пустую или пустую строку как int. Измените int.Parse строку на:

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

ОБНОВЛЕНИЕ: Теперь, когда вы вставили фактическое изображение того, как выглядит Сетка, я думаю, что Джоэл Этертон прав, вы пытаетесь проанализировать дату как целое число. Ячейка [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;
        }
    }
}
1 голос
/ 13 марта 2013

Мне было трудно понять эти сложные решения, поэтому я провел небольшое исследование, и вот мое решение. Я оставляю это здесь, надеясь, что это поможет кому-то

Я изменил свой код сетки, как это

<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 должен ответить на вопрос.

1 голос
/ 12 сентября 2011

Здесь я вижу, что проблема возникает, и, честно говоря, этот кусок кода немного беспорядок.

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, делает слишком много всего за один выстрел.Я не говорю, что это невозможно, но он генерирует много серой области относительно того, откуда происходят любые сгенерированные ошибки.

0 голосов
/ 12 сентября 2011

Я согласен с 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;
        }
...