ASP中的动态更改:GridView列

时间:2010-08-02 07:17:36

标签: .net asp.net .net-3.5 gridview

我创建了一个GridView,其列是根据我的数据源动态创建的。其中一列是状态字段,显示是?没有基于数据库中状态字段的图像。

<asp:TemplateField HeaderText="Status">                                                                 
   <ItemTemplate>
    <asp:Image runat="server" ImageAlign="Middle" ID="imgStatus" ImageUrl= '<%# "/images/actions/" + ((Convert.ToInt32(Eval("StatusFlag")) == 0) ? "actionInActive.gif" : "actionActive.gif") %>' ToolTip='<%# ((Convert.ToInt32(Eval("StatusFlag")) == 0) ? "No" : "Yes") %>' />
    </ItemTemplate>
    <ItemStyle HorizontalAlign="Center" Width="40px"/>
</asp:TemplateField>   

但是,显示表格中每一行的状态会在页面上产生大量的视觉噪音。因此,如果页面上有更多条目,并且如果条目数量很少,则只显示[是/否]图标,而不是这种方法我只想显示是状态。

任何人都可以就如何实现这一点提出一些建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

你的问题我能理解的是你想要两件事

*)。如果记录很少,那么你想在每一行显示两件事,一个是状态图像和状态。

*)。如果有很多记录,那么你只想显示状态文本而不是图像。

如果我是对的,那么解决方案就在这里:

在ItemTemplate Image和html标签中添加两个控件,并根据条件更改其Visibility.Like

 <asp:TemplateField HeaderText="Status">
    <ItemTemplate>
       <asp:Image Visible='<%# Check(Convert.ToString(Eval(Image))) %>' ID="img" runat="server" ImageUrl='<% Eval(Image) %>' /> 
       // for ImageUrl, you can put more condition for 'yes' and 'no' image.
       <asp:Label Visible='<%# Check(Convert.ToString(Eval(Image)))  %>' ID="status" Text='<% Eval(Status) %>' runat = "server" />
    </ItemTemplate>
 </asp:TemplateField>

现在,在您的数据源中,您必须根据需要进行一些更改,例如.. 在装订时,您将决定要显示图像的天气,如果没有,则将数据源的图像值更新为“#”。现在Check(string imageUrl)是函数背后的代码

   public bool Check(string title)
    {
        if (title == "#")
            return false;
        else
            return true;
    }

将来,如果您只想在某些行上显示图像,那么您必须对您的特定代码进行一点改动,这些代码用于更新图像URL,而其他代码将自动运行。

答案 1 :(得分:1)

您可以像这样轻松隐藏整个列。

myGridView.DataBind();
if (myGridView.Rows.Count > Threshold)
    myGridView.Columns[StatusColumnIndex].Visible = false;

要仅显示“是”条目,您可以在绑定时使用LINQ进行过滤。

if (myData.Length > Threshold)
{
    myGridView.DataSource = myData.Where(d => d.Status == Status.Yes);
    myGridView.Columns[StatusColumnIndex].Visible = false;
}
else
{
    myGridView.DataSource = myData;
    myGridView.Columns[StatusColumnIndex].Visible = true;
}
myGridView.DataBind();