Ссылка ImageButton в asp.net - PullRequest
       2

Ссылка ImageButton в asp.net

2 голосов
/ 14 февраля 2012

У меня есть GridView с двумя столбцами, которые можно сортировать.После его сортировки я хочу отобразить изображение рядом со столбцом со стрелкой вверх или вниз для сортировки по Asc и Desc.

Я не могу понять, как ссылаться на объект ImageButton, чтобы я мог установить для ImageButton.ImageUrl фактическое изображение на основе его Asc и Desc.

Вот мой код ASPX:1005 *

          <Columns>
            <asp:TemplateField>
              <HeaderTemplate>
                <asp:LinkButton ID="Name_SortLnkBtn" runat="server" Text="Name:" ToolTip="Click to Sort Column" CommandName="Sort" CommandArgument="Name" CausesValidation="false" />
                <asp:ImageButton ID="Name_SortImgBtn" runat="server" Visible="false" ToolTip="Click to Sort Column" CommandName="Sort" CommandArgument="Name" CausesValidation="false" />
              </HeaderTemplate>                    
              <ItemTemplate>
                 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# "~/TestResults/Diabetes.aspx?ID="+Eval("ID") %>'><%#Eval("Name")%></asp:HyperLink>                                    
              </ItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField>
              <HeaderTemplate>
                <asp:LinkButton ID="HouseName_SortLnkBtn" runat="server" Text="House Name:" ToolTip="Click to Sort Column" CommandName="Sort" CommandArgument="House" CausesValidation="false" />
                <asp:ImageButton ID="HouseName_SortImgBtn" runat="server" Visible="false" ToolTip="Click to Sort Column" CommandName="Sort" CommandArgument="House" CausesValidation="false" />
              </HeaderTemplate>                  
              <ItemTemplate><%#Eval("House")%></ItemTemplate>
            </asp:TemplateField>                 
          </Columns>

Помощь будет принята с благодарностью.

Обновлен файл .aspx.cs:

public partial class Home : System.Web.UI.Page
{
    protected _code.SearchSelection _SearchSelection = new _code.SearchSelection();
    protected _code.Utils _utils = new _code.Utils();
    protected ImageButton sortImage = new ImageButton();
    protected void Page_Load(object sender, EventArgs e) {
        //if (!IsPostBack) {
        Master.FindControl("Home").ID = "active";
        GridView1_DataBind();
        //Guid ID = new Guid(_SearchSelection.getUserID().Tables[0].Rows[0]["u_ID"].ToString());             
        //}
    }

    protected void GridView1_DataBind() {
        string selection = string.Empty;
        TreeView treeMain = (TreeView)tree.FindControl("treeMain");
        if (treeMain.SelectedNode != null)
            selection = treeMain.SelectedNode.Text;
        else
            selection = Session["Selection"].ToString();
        DataSet mainData = _utils.getStoreProcedure(new SqlParameter[] { new SqlParameter("@Selection", selection) }, "sp_getTenantsWithDiabetes", ConfigurationManager.ConnectionStrings["TIPS4"].ConnectionString);
        Session["MainData"] = mainData.Tables[0];
        GridView1.DataSource = mainData.Tables[0];
        GridView1.DataBind();
    }

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {

        //Retrieve the table from the session object.
        DataTable dt = Session["MainData"] as DataTable;
        ImageButton imageButton = new ImageButton();
        if (dt != null) {
            //Sort the data.
            dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
            //imageButton.ImageUrl = "~/App_Themes/Sugar2006/Images/arrow_up.gif";
            //imageButton.Visible = true;
            this.GridView1.DataSource = Session["MainData"];
            this.GridView1.DataBind();
        }
    }
    private string GetSortDirection(string column) {

        // By default, set the sort direction to ascending.
        string sortDirection = "ASC";

        // Retrieve the last column that was sorted.
        string sortExpression = ViewState["SortExpression"] as string;

        if (sortExpression != null) {
            // Check if the same column is being sorted.
            // Otherwise, the default value can be returned.
            if (sortExpression == column) {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "ASC")) {
                    sortDirection = "DESC";
                }
            }
        }

        // Save new values in ViewState.
        ViewState["SortDirection"] = sortDirection;
        ViewState["SortExpression"] = column;

        return sortDirection;
    }

    protected void gridView1_RowDataBound(object sender, GridViewRowEventArgs e) {
        if (e.Row.RowType == DataControlRowType.Header) {                               
            var imageButton = (ImageButton)e.Row.FindControl("Name_SortImgBtn");
            sortImage = imageButton;
            //imageButton.ImageUrl = "~/App_Themes/Sugar2006/Images/arrow_up.gif";
            //imageButton.Visible = true;
        }
    }

1 Ответ

2 голосов
/ 14 февраля 2012

Чтобы получить ссылку на ImageButton, определенный в вашем HeaderTemplate, вы можете подключить событие RowDataBound к GridView. В обработчике событий проверьте, является ли строка строкой заголовка, с помощью свойства RowType, а затем используйте метод FindControl, чтобы получить ссылку на элемент управления.

protected void gridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.Header)
    {
        var imageButton = (ImageButton)e.Row.FindControl("Name_SortImgBtn");
        imageButton.ImageUrl = "~/myimage.gif";
    }
}

EDIT

Я думаю, вы на правильном пути. Я бы сделал следующие изменения:

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{
    //Retrieve the table from the session object.
    DataTable dt = Session["MainData"] as DataTable;
    if (dt == null) return;

    //Sort the data
    dt.DefaultView.Sort = e.SortExpression + " " +
                          GetSortDirection(e.SortExpression);
    this.GridView1.DataSource = dt;
    this.GridView1.DataBind();
}

Нет необходимости беспокоиться о ImageButton в обработчике Sorting. Щелчок по LinkButton в заголовке вызовет обратную запись, и будет вызван обработчик события Sorting. Он будет запущен до того, как будет вызвано событие RowDataBound (этого не произойдет, пока не будет вызван метод GridView1.DataBind). Кроме того, метод GetSortDirection сохранит выражение сортировки и порядок сортировки в ViewState. Эти значения понадобятся нам позже в обработчике событий RowDataBound (показано ниже).

protected void gridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{
    if (e.Row.RowType == DataControlRowType.Header) 
    {
        //Determine sort column and sort order
        var column = ViewState["SortExpression"] != null ? 
                     ViewState["SortExpression"].ToString() : string.Empty;
        var sortDirection = ViewState["SortDirection"] != null ? 
                     ViewState["SortDirection"].ToString() : string.Empty;

        //Find ImageButton based on sort column (return if not found)
        var imageButtonID = string.Concat(column, "_SortImgBtn");
        var imageButton = e.Row.FindControl(imageButtonID) as ImageButton;
        if(imageButton == null) return;

        //Determine sort image to display
        imageButton.ImageUrl = string.Equals("asc", sortDirection.ToLower()) ?
                               "~/App_Themes/Sugar2006/Images/arrow_up.gif" :
                               "~/App_Themes/Sugar2006/Images/arrow_down.gif";
        imageButton.Visible = true;
    }
}

В этом обработчике событий мы извлечем значения, хранящиеся в ViewState, чтобы определить, какой ImageButton сделать Visible и какой URL-адрес изображения использовать в зависимости от направления сортировки. Я сделал предположение, что вы дали ImageButton элементам управления ID имени столбца плюс "_SortImgBtn" (если вы будете действовать таким образом, вы можете избежать оператора switch для сопоставления столбца с именем элемента управления). Просто убедитесь, что для ImageButton элементов управления на главной странице Visible установлено значение false, и должно появиться изображение сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...