【问题标题】:Display DataGrid Column as Hyperlink Column depending on column value根据列值将 DataGrid 列显示为超链接列
【发布时间】:2013-08-31 11:48:50
【问题描述】:

我有下面的 DataGrid 没有问题

<asp:DataGrid ID="fileBrowserGrid" runat="server" Width="100%" PageSize="14" AllowPaging="True"
        CellPadding="1" GridLines="None" BorderColor="#636E92" BorderWidth="0px" AutoGenerateColumns="False"
        OnPageIndexChanged="fileBrowserGrid_PageIndexChanged">
        <AlternatingItemStyle CssClass="mainbodytextalt"></AlternatingItemStyle>
        <ItemStyle CssClass="metadatabodytext"></ItemStyle>
        <HeaderStyle CssClass="metadatabodytitle"></HeaderStyle>
        <FooterStyle CssClass="Blue"></FooterStyle>
        <Columns>
            <asp:BoundColumn DataField="LoadedFileID" HeaderText="Loaded File Id" Visible="False"></asp:BoundColumn>
            <asp:BoundColumn DataField="DataSupplierCode" HeaderText="Data Supplier Code"></asp:BoundColumn>
            <asp:BoundColumn DataField="DataSupplierName" HeaderText="Data Supplier Name"></asp:BoundColumn>
            <asp:BoundColumn DataField="Filename" HeaderText="File Name"></asp:BoundColumn>
            <asp:BoundColumn DataField="DateLoaded" HeaderText="Date Loaded"></asp:BoundColumn>
            <asp:BoundColumn DataField="LoadStatus" HeaderText="Status"></asp:BoundColumn>
        </Columns>
        <PagerStyle CssClass="Gray"></PagerStyle>
</asp:DataGrid>

后面的代码:

DataSet dataSet = results.DataSet;
this.fileBrowserGrid.DataSource = dataSet;
this.fileBrowserGrid.DataBind();

我想更改“状态”列,以便在值为“失败”时显示一个指向 errormessage.aspx 的超链接,其中 id 作为查询字符串值,但如果值为“失败”,则保持正常文本值。

理想情况下,我不想更改我的存储过程

我一直在查看 RowDataBind,但无法使其正常工作。

有什么想法吗?谢谢!

【问题讨论】:

    标签: c# asp.net datagrid webforms datagridtemplatecolumn


    【解决方案1】:

    我有一个只有 aspx 的解决方案,不涉及 cs 后端

    您可以预测模板 Column 的渲染。尝试这个 我想指示失败的代码状态是“失败”

    <asp:TemplateColumn>
                    <HeaderTemplate>
                        <b>Status </b>
                    </HeaderTemplate>
                    <ItemTemplate>
                        <asp:PlaceHolder ID="Ok" runat="server" Visible='<%# (Eval("LoadStatus").ToString()=="Failed"?false:true) %>'><%----%>
                            <asp:Label ID="Label1" Text='<%# Eval("LoadStatus") %>' runat="server" />
                        </asp:PlaceHolder>
                        <asp:PlaceHolder ID="Ko" runat="server" Visible='<%# (Eval("LoadStatus").ToString()=="Failed"?true:false) %>'><%----%>
                            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# string.Format("DataLoaderErrorMessage.aspx?id={0}",Eval("LoadedFileID"))%>'><%# Eval("LoadStatus") %></asp:HyperLink>
                        </asp:PlaceHolder>
                    </ItemTemplate>
                </asp:TemplateColumn>
    

    【讨论】:

    • 感谢您的回复。这几乎可以正常工作,因为它创建了字符串 ok,但它似乎没有读取 LoadStatus 值,因为所发生的只是所有显示为文本,因为标签默认为 true,超链接默认为 false
    • 对不起,我是法国人,我的英语不流利。我不明白发生了什么。您的问题是在这部分代码上吗?
    • 我让它工作了,你所缺少的只是 Eval("LoadStatus") 之后的 .ToString()。我已更新您的答案以显示这一点,并将您的答案标记为正确。谢谢。
    • 是的,他错过了,很抱歉忘记了
    【解决方案2】:

    1) 将数据网格的 AutoGenerateColumns 属性设置为 false。 2)为状态创建一个模板列而不是绑定列。 3) 为每一列(模板列除外)设置“DataField”属性,以便他们知道要从 sql 数据源显示哪个值。 4) 编辑模板列并在其中添加一个带有 id divStatus 的 html div

     <asp:TemplateField HeaderText="Status">
          <ItemTemplate>
               <div id="divStatus" runat="server">
               </div>
          </ItemTemplate>
     </asp:TemplateField>
    

    在设置gridview的数据源后遍历所有行并执行如下操作。

     for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                {
                    HtmlGenericControl divStatus = (HtmlGenericControl)fileBrowserGrid.Rows[i].FindControl("divStatus");
    
                    if(dataSet.Tables[0].Rows[i]["LoadStatus"].ToString() != "Failed")
                         divStatus.InnerHtml = dataSet.Tables[0].Rows[i]["LoadStatus"].ToString();
                    else
                         divStatus.InnerHtml = "<a href='pageURL.aspx?ID=" + dataSet.Tables[0].Rows[i]["LoadedFileID"].ToString() + "'> Failed : " + dataSet.Tables[0].Rows[i]["LoadedFileID"].ToString() + "</a>";
                }
    

    【讨论】:

    • 感谢您的回复。这看起来可以工作,但适用于 GridView 而不是 DataGrid(它是一个旧站点)。如果我也有的话,我可能会更新,但现在尽量避免这样做以避免不得不玩 css
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多