根据列值将DataGrid列显示为超链接列

时间:2013-08-28 12:01:37

标签: c# asp.net datagrid webforms datagridtemplatecolumn

我有以下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();

我想更改Status列,以便显示一个指向errormessage.aspx的超链接,如果值为'Failed',则id为查询字符串值,但如果是其他任何内容则保持为正常文本值。

理想情况下,我不想对存储过程进行更改

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

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

<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>

答案 1 :(得分:0)

1)将datagrid的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>";
            }