如何对包含图像的网格视图列进行排序

3
<asp:TemplateField HeaderText="Status" ItemStyle-Width="15%">
                                <ItemTemplate>
                                    <asp:Image ID="Status" runat="server" />
                                </ItemTemplate>
                            </asp:TemplateField>

我在我的网格视图中有这一列,但是我的表中没有状态列,我使用rowdatabound根据其他列中的值显示图像。

   protected void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Image img = (Image)e.Row.FindControl("Status");
            DateTime received;
            DateTime read;
            DateTime.TryParse(Convert.ToString(DataBinder.Eval(e.Row.DataItem, "TimeReceived")), out received);
            DateTime.TryParse(Convert.ToString(DataBinder.Eval(e.Row.DataItem, "TimeRead")), out read);
            if (received == DateTime.MinValue)
            {
                img.ImageUrl = "Styles/Images/red.png";
                img.ToolTip = "Message Not Received";
            }
            else (read == DateTime.MinValue)
            {
                img.ImageUrl = "Styles/Images/amber.png";
                img.ToolTip = "Message Received";
            }
                          img.Visible = true;
        }
    }

如何对状态列进行排序,其他列我已经使用列名作为排序表达式并对其进行了排序。但是对于这个带有图像的列,我该如何进行排序。

2个回答

1
通常我已经在后端设置了一个属性来保存“状态”,然后你可以按照它进行排序,仍然可以应用你的UI逻辑。
<asp:TemplateField HeaderText="Status" SortExpression="MessageStatus">
    <ItemTemplate>
       <asp:Image ID="Status" runat="server" />
    </ItemTemplate>
</asp:TemplateField>


public YourObject
{
   public string MessageStatus {get; set;}
   ..........
}

在调用查询时将逻辑放在业务层中:

//call db
//fill object
   //while filling object
     DateTime received = this.TimeReceived
     DateTime read = this.TimeRead          
     if (received == DateTime.MinValue)
     {  
         MessageStatus  = "Message Not Received";
     }
     else (read == DateTime.MinValue)
     {
         MessageStatus  = "Message Received";
     }

行数据绑定:

protected void MyGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Image img = (Image)e.Row.FindControl("Status");

        string messsageStatus = DataBinder.Eval(e.Row.DataItem, "MessageStatus") as string;

        if (messsageStatus == "Message Not Received")
        {
            img.ImageUrl = "Styles/Images/red.png";
            img.ToolTip = messsageStatus ;
        }
        else if (messsageStatus == "Message Received")
        {
            img.ImageUrl = "Styles/Images/amber.png";
            img.ToolTip = messsageStatus ;
        }
        img.Visible = true;
    }
}

你的意思是为图像设置一个值吗?当我尝试将排序表达式设置为状态并进行排序时,我收到的错误是找不到状态列。 - Mark
更新了答案并附上了一个实现示例。 - rick schott

0
在您的模板中添加一个SortExpression,这个表达式可以命名另一个可排序的字段。
<asp:TemplateField HeaderText="Status" SortExpression="SomeOtherColumn">
    <ItemTemplate>
       <asp:Image ID="Status" runat="server" />
    </ItemTemplate>
</asp:TemplateField>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接