如何对具有图像的网格视图列进行排序

Posted

技术标签:

【中文标题】如何对具有图像的网格视图列进行排序【英文标题】:How to sort a grid view column which has a image 【发布时间】:2011-12-28 16:00:51 【问题描述】:
<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;
        
    

我如何对状态列进行排序,其他列我有排序表达式作为列名,我正在对其进行排序。但是对于这个带有图片的专栏,我该如何进行排序。

【问题讨论】:

【参考方案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;
    

【讨论】:

您的意思是为图像设置一个值吗?当我尝试将排序表达式添加为状态并尝试排序时,我得到的错误是未找到状态列 用示例实现更新了答案。【参考方案2】:

在您的模板中添加一个SortExpression,以命名您可以排序的另一个字段。

<asp:TemplateField HeaderText="Status" SortExpression="SomeOtherColumn">
    <ItemTemplate>
       <asp:Image ID="Status" runat="server" />
    </ItemTemplate>
</asp:TemplateField>

【讨论】:

以上是关于如何对具有图像的网格视图列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击列标题时对网格视图中的记录进行排序

修复了带有排序功能的标题网格视图

将数据网格视图背景设置为透明

清除排序描述后如何删除wpf网格排序箭头

具有自定义网格视图的 AsyncTask

Android:谷歌照片,如具有缩放功能的网格视图