【问题标题】:How to display arrow in GridView on page load如何在页面加载时在 GridView 中显示箭头
【发布时间】:2014-06-30 19:07:31
【问题描述】:

我有一个 GridView,我在其中显示文件夹中的一些文件。我能够为两个列标题添加向上和向下箭头,以根据排序进行更新。单击两次列标题后,箭头出现。

网格视图:

<asp:GridView ID="GridView1" AllowSorting="true" OnSorting="GridView1_Sorting" ClientIDMode="Static" runat="server" AutoGenerateColumns="false" EmptyDataText="No PDF was generated" OnRowCreated="GridView1_RowCreated">
            <Columns>
                <asp:BoundField DataField="Text" HeaderText="File Name" SortExpression="FileName" />
                <asp:BoundField DataField="Value" HeaderText="File Modified Date" SortExpression="FileDate" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkDownload" Text="Download" runat="server" CommandArgument='<%# Container.DataItemIndex %>' OnClick="DownloadFile" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkView" Text="View in Browser" CommandArgument='<%# Container.DataItemIndex %>' OnClientClick="window.document.forms[0].target='blank';" runat="server" OnClick="ViewFile" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

Page_Load:

if (!Page.IsPostBack) //loaded first time...
{
    //MessageBox.Show("Fires from a PAGE REFRESH or FIRST VISIT");
    BindData();
}

支持功能:

protected void BindData()
{
    try
    {
        filePaths = Directory.GetFiles(@"C:\PDFGenerate");
        files = new List<ListItem>();
        foreach (string filePath in filePaths)
        {
            files.Add(new ListItem(Path.GetFileName(filePath), File.GetLastWriteTime(filePath).ToString()));

        }
        //GridView1.DataSource = files;
        //GridView1.DataBind();
        Session["fileData"] = files;
        Sort(files, SortDirection.Descending);
    }
    catch (Exception ce)
    {
    }
    //MessageBox.Show(files.Count() + ""); // displays the count for the files being displayed
}
public void Sort(IList<ListItem> items, SortDirection direction)
{
    var dataTable = ToDataTable(items);
    var dataView = new DataView(dataTable);
    dataView.Sort = string.Format("{0} {1}", "Value",
        direction == SortDirection.Ascending ? "ASC" : "DESC");
    GridView1.DataSource = dataView;
    GridView1.DataBind();
}
public DataTable ToDataTable(IList<ListItem> data)
{
    var table = new DataTable();
    table.Columns.Add("Value", typeof(string));
    table.Columns.Add("Text", typeof(string));

    foreach (var item in data)
    {
        var row = table.NewRow();
        row["Value"] = item.Value;
        row["Text"] = item.Text;
        table.Rows.Add(row);
    }
    return table;
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        LinkButton lbSort;
        Image imgArrow;

        foreach (TableCell cell in e.Row.Cells)
        {
            if (cell.HasControls())
            {
                lbSort = (LinkButton)cell.Controls[0];
                imgArrow = new Image();

                if (ViewState["SortColumn"] != null)
                {
                    if (lbSort.CommandArgument == ViewState["SortColumn"].ToString())
                    {
                        if (Convert.ToInt32(ViewState["SortColumnDirection"]) == (int)SortDirection.Ascending)
                        {
                            imgArrow.ImageUrl = "down.png";
                            //MessageBox.Show("UP");
                        }
                        else
                        {
                            imgArrow.ImageUrl = "up.png";
                            //MessageBox.Show("DOWN");
                        }
                        cell.Controls.Add(imgArrow);
                    }
                }
            }
        }
    }
}

protected void GridView1_Sorting(object server, GridViewSortEventArgs e)
{
    string strSortExpression = e.SortExpression;
    MessageBox.Show(e.SortExpression.ToString());
    MessageBox.Show(e.SortDirection.ToString());
    switch (strSortExpression)
    {
        case "FileName":
            if (e.SortExpression == (string)ViewState["SortColumn"])
            {
                // We are resorting the same column, so flip the sort direction
                e.SortDirection =
                    ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
                    SortDirection.Descending : SortDirection.Ascending;
            }
            Sort2((IList<ListItem>)Session["fileData"], e.SortDirection, "filename");
            ViewState["SortColumn"] = e.SortExpression;
            ViewState["SortColumnDirection"] = e.SortDirection;
            break;
        case "FileDate":
            if (e.SortExpression == (string)ViewState["SortColumn"])
            {
                // We are resorting the same column, so flip the sort direction
                e.SortDirection =
                    ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ?
                    SortDirection.Descending : SortDirection.Ascending;
            }
            Sort2((IList<ListItem>)Session["fileData"], e.SortDirection, "filedate");
            ViewState["SortColumn"] = e.SortExpression;
            ViewState["SortColumnDirection"] = e.SortDirection;
            break;
    }
}
public void Sort2(IList<ListItem> items, SortDirection direction, string type)
{
    var dataTable = ToDataTable(items);
    var dataView = new DataView(dataTable);
    switch (type)
    {
        case "filename":
            dataView.Sort = string.Format("{0} {1}", "Text",
                direction == SortDirection.Ascending ? "ASC" : "DESC");
            GridView1.DataSource = dataView;
            GridView1.DataBind();
            break;
        case "filedate":
            dataView.Sort = string.Format("{0} {1}", "Value",
                direction == SortDirection.Ascending ? "ASC" : "DESC");
            GridView1.DataSource = dataView;
            GridView1.DataBind();
            break;
    }
}
  • 如何在页面加载时显示箭头? (我是 在页面加载时按文件修改日期排序)

  • 为什么要在相应的标题上单击两次才能显示箭头? (虽然排序正确,但第一次点击不同的标题列时箭头显示错误,需要额外点击才能正确显示图像) 示例:

【问题讨论】:

  • 你在哪里设置 ViewState["SortColumn"] ??
  • 用我定义它的代码更新了我的问题。
  • 向下箭头的代码是 ↓向上箭头是: ↑问候,

标签: c# asp.net gridview


【解决方案1】:

在页面加载时你没有得到图像,因为

ViewState["SortColumn"] 为 null,在 GridView_Sorting 函数中设置(在 page_load 上不调用)

将其设置为默认值

再次,您无法在第一次排序点击时设置图像,因为在 GridView_Sorting 函数之前调用了 RowCreated

所以下次点击它时,row_created 会找到值并设置图像

【讨论】:

  • 如何设置默认值?
  • 设置 ViewState["SortColumn"] = "FileName";在 GridView1.DataBind() 之前; Sort(IList items, SortDirection direction) 函数中的行
  • 这会显示箭头,但现在我在此处收到 Object reference not set to an instance of an object 错误:e.SortDirection = ((SortDirection)ViewState["SortColumnDirection"] == SortDirection.Ascending) ? SortDirection.Descending : SortDirection.Ascending;case "FileName" 的排序函数中。
  • 在将 ViewState["SortColumnDirection"] 转换为 SortDirection 之前检查其值
  • 如果我单击另一列并返回到引发错误的列,它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多