如何允许GridView排序并将文本显示为链接

时间:2014-08-05 14:59:40

标签: c# asp.net gridview-sorting

我希望能够通过点击以下GridView

的每个标题来允许用户进行排序
<asp:GridView OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="There is no data to display"></asp:GridView>

我在SQL查询中填充上述内容:

string query = @"SELECT  CT.ATTR2739 'Task Name'
                ,UG.USERGROUPNAME 'Department'
                ,CT.ATTR2812 'Status'
                ,CT.ATTR2752 'Due Date'
                ,'http://dvmag/appnet/workview/objectPop.aspx?objectid=' + CAST(CT.OBJECTID AS VARCHAR) + '&classid=1224' 'Link'
            FROM HSI.RMOBJECTINSTANCE1224 CT LEFT JOIN HSI.USERGROUP UG on CT.FK2743 = UG.USERGROUPNUM
            WHERE CT.ACTIVESTATUS = 0";

using (SqlConnection conn = new SqlConnection(connString))
{
    try
    {
        SqlCommand cmd = new SqlCommand(query, conn);

        // create data adapter
        SqlDataAdapter da = new SqlDataAdapter(query, conn);
        // this will query your database and return the result to your datatable
        da.Fill(taskData);
        //conn.Close();
        yourTasksGV.DataSource = taskData;
        yourTasksGV.DataBind();

    }
    catch (Exception ex)
    {
        string error = ex.Message;
    }
}

显示以下内容:

enter image description here

  • 如何才能使Task NameDepartmentStatusDue DateLink可点击以对ASC / DESC进行排序?
  • 如何将Link行显示的所有链接都设为Task Name? (例如:<a href="http://...objectid=8087&classid=1224">Test Event 1</a>

我将GridView更改为:

<asp:GridView OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="There is no data to display">
                        <Columns>
                            <asp:BoundField DataField="Text" HeaderText="Task Name" SortExpression="TaskName" />
                            <asp:BoundField DataField="Text" HeaderText="Department" SortExpression="DepartmentName" />
                            <asp:BoundField DataField="Text" HeaderText="Status" SortExpression="TheStatus" />
                            <asp:BoundField DataField="Text" HeaderText="Due Date" SortExpression="DueDate" />
                            <asp:BoundField DataField="Link" HeaderText="Complete Task" SortExpression="CompleteTask" />
                        </Columns>
                    </asp:GridView>

这就是出现的情况:

enter image description here

2 个答案:

答案 0 :(得分:1)

显式添加列,如下所示:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.columns(v=vs.110).aspx

您的DataTextFields必须与列名称对齐 - 而不是“文本”或“链接”(除非文本和链接是有效的列名称)。

这将允许您将列类型指定为超链接。不要在查询中包含完整链接,而是使用HyperLinkField中的DataNavigateUrlFormatString。 HyperLinkField允许您分别定义DataNavigateUrlField和DataTextField。

请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.hyperlinkfield(v=vs.110).aspx

要使列可排序,请务必在列上设置SortExpression。

以这种方式定义列时,还必须在GridView上将AutoGenerateColumns设置为false。

<asp:GridView OnSorting="yourTasksGV_Sorting" AllowSorting="true" ID="yourTasksGV" runat="server" ClientIDMode="Static" EmptyDataText="There is no data to display" AutoGenerateColumns ="False">
    <Columns>
        <asp:BoundField DataField="Task Name" HeaderText="Task Name" SortExpression="TaskName" />
        <asp:BoundField DataField="Department" HeaderText="Department" SortExpression="DepartmentName" />
        <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="TheStatus" />
        <asp:BoundField DataField="Due Date" HeaderText="Due Date" SortExpression="DueDate" />
        <asp:HyperLinkField DataNavigateUrlFields="Link" DataTextField="Task Name" DataNavigateUrlFormatString="http://...objectid={0}&classid=12240" HeaderText="Complete Task" SortExpression="CompleteTask" />
    </Columns>
</asp:GridView>

然后,将查询的SELECT部分​​更改为以下内容:

SELECT  
CT.ATTR2739 'Task Name'
,UG.USERGROUPNAME 'Department'
,CT.ATTR2812 'Status'
,CT.ATTR2752 'Due Date'
,CT.OBJECTID 'Link' 

答案 1 :(得分:1)

我建议将它们转换为模板字段。这是一个看起来如何的例子。

<asp:TemplateField HeaderText="Link" SortExpression="Link">
         <EditItemTemplate>
                  <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Link") %>'></asp:TextBox>
         </EditItemTemplate>
         <ItemTemplate>
                  <asp:LinkButton ID="LinkButton1" runat="server" Text='<%# Bind("Link") %>'></asp:Label>
         </ItemTemplate>
         <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

如果您不想编辑信息,可以删除EditItemTemplate,这会清理一下。希望这有帮助!

编辑:

要将它们转换为模板字段,您需要在设计视图中单击gridview上的智能标记。完成后,单击编辑列,选择要转换的列,然后在该页面的右下角选择转换为模板字段选项。一旦你这样做,如果你想使用一个链接按钮,你将不得不从标签中更改它们,就像转换它们一样,文本框是默认的编辑,标签是默认的项目。