Сортировка выражения RowDataBound Fill Data внутри вида сетки - PullRequest
0 голосов
/ 13 февраля 2020

Сортировка выражения RowDataBound Fill Data внутри grid-view, у меня есть ниже gridview:

            <asp:GridView ID="gv_lastlogindetails" runat="server" DataKeyNames="DistrictId,UserName" BorderColor="White" OnRowDataBound="gv_lastlogindetails_RowDataBound"
AutoGenerateColumns="false" CssClass="table table-bordered alert-master" AllowSorting="true" OnSorting="gv_lastlogindetails_Sorting">
<Columns>

<asp:TemplateField HeaderText="Role Name" SortExpression="RoleName" >
<ItemTemplate>
<asp:Label ID="lbl_RoleName" runat="server" Text='<%# Eval("RoleName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="District" SortExpression="District" >
<ItemTemplate>
<asp:Label ID="lbl_District" runat="server" Text='<%# Eval("District") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Inspection Body Name" SortExpression="FullName" >
<ItemTemplate>
<asp:Label ID="lbl_FullName" runat="server" Text='<%# Eval("FullName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Email Id" SortExpression="EmailId" >
<ItemTemplate>
<asp:Label ID="lbl_EmailId" runat="server" Text='<%# Eval("EmailId") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="Mobile" SortExpression="Mobile" >
<ItemTemplate>
<asp:Label ID="lbl_Mobile" runat="server" Text='<%# Eval("Mobile") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

<asp:TemplateField HeaderText="No of Times Visited" >
<ItemTemplate>
<asp:Label ID="lbl_NofTimesVisited" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Login Time" ItemStyle-Width="12%">
<ItemTemplate>
<asp:Label ID="lbl_LastLoginTime" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Login SystemIp">
<ItemTemplate>
<asp:Label ID="lbl_LastLoginSystemIp" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="No of days from last login">
<ItemTemplate>
<asp:Label ID="lbl_Noofdaysfromlastlogin" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>No Records</EmptyDataTemplate>
</asp:GridView>

Ниже приведен мой метод сортировки

  protected void gv_lastlogindetails_Sorting(object sender, GridViewSortEventArgs e)
   {
    string sortingDirection = string.Empty;
    //Assigning sort condition
    if (direction == SortDirection.Ascending)
    {
        direction = SortDirection.Descending;
        sortingDirection = "Desc";
        sortImage.ImageUrl = "img/view_sort_descending.png";

        //var span = new HtmlGenericControl("span");
        //span.Attributes["class"] = "fa fa-sort-alpha-desc";
        //sortImage.Controls.Add(span);

    }
    else
    {
        direction = SortDirection.Ascending;
        sortingDirection = "Asc";
        sortImage.ImageUrl = "img/view_sort_ascending.png";

        //var span = new HtmlGenericControl("span");
        //span.Attributes["class"] = "fa fa-sort-alpha-asc";
        //sortImage.Controls.Add(span);

    }
    FillGrid();
    DataTable dtSortTable = gv_lastlogindetails.DataSource as DataTable; //get gridview datatable 
    if (dtSortTable != null)
    {
        DataView sortedView = new DataView(dtSortTable);
        sortedView.Sort = e.SortExpression + " " + sortingDirection;//sort using the direction assigned previously 
        Session["SortedView"] = sortedView;
        gv_lastlogindetails.DataSource = sortedView;
        gv_lastlogindetails.DataBind();
        int columnIndex = 0;
        foreach (DataControlFieldHeaderCell headerCell in gv_lastlogindetails.HeaderRow.Cells)
        {
            if (headerCell.ContainingField.SortExpression == e.SortExpression)
            {
                columnIndex = gv_lastlogindetails.HeaderRow.Cells.GetCellIndex(headerCell);
            }
        }
        gv_lastlogindetails.HeaderRow.Cells[columnIndex].Controls.Add(sortImage);//setting sort Image in the header row 
    }
}

Ниже приведено заполнение моего поля строки с четырьмя строками Нет Количество посещений, время последнего входа в систему, время последнего входа в систему и число дней. Я могу отсортировать поле «Первый шаблон 4», так как оно непосредственно заполняет последние четыре, и не может выполнить сортировку, поскольку оно связано с полем со строкой данных.

protected void gv_lastlogindetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{

if (!string.IsNullOrEmpty(Session["Username"] as string) && !string.IsNullOrEmpty(Session["DistrictId"] as string))
{ 
string defaultdate = "01/01/1900";
bo.Dateused = DateTime.ParseExact(defaultdate.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
bo.Dateused1 = DateTime.ParseExact(defaultdate.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
if (Session["RoleId"].ToString() == "2")/  
{
if (ddl_District.SelectedValue.ToString() == "0")
{
bo.Num1 = 0;
}
else
{
bo.Num1 = int.Parse(ddl_District.SelectedValue.ToString());
}
}
else
{
bo.Num1 = int.Parse(Session["DistrictId"].ToString());//districtId //OTHER ROLES
}
bo.Num2 = 2;//Paravalue
bo.Num3 = 0;//CCId
if (Session["RoleId"].ToString() == "2")/ 
{
bo.Para1 = gv_lastlogindetails.DataKeys[e.Row.RowIndex].Values[1].ToString();//username
}
else
{
bo.Para1 = Session["Username"].ToString();//UserName other roles
}

DataTable dt = bl.Get_MisReports(bo);

if (dt.Rows.Count > 0)
{
((Label)e.Row.FindControl("lbl_NofTimesVisited")).Text = dt.Rows[0]["NofTimesVisited"].ToString();
((Label)e.Row.FindControl("lbl_LastLoginTime")).Text = dt.Rows[0]["LastLoginTime"].ToString();
((Label)e.Row.FindControl("lbl_LastLoginSystemIp")).Text = dt.Rows[0]["LastLoginSystemIp"].ToString();
((Label)e.Row.FindControl("lbl_Noofdaysfromlastlogin")).Text = dt.Rows[0]["Noofdaysfromlastlogin"].ToString();
}
else
{
((Label)e.Row.FindControl("lbl_NofTimesVisited")).Text = "0";
((Label)e.Row.FindControl("lbl_LastLoginTime")).Text = "0";
((Label)e.Row.FindControl("lbl_LastLoginSystemIp")).Text = "0";
((Label)e.Row.FindControl("lbl_Noofdaysfromlastlogin")).Text = "0";
}

}
else
{
Response.Redirect("sessionexpired.aspx");
Session.Clear();
Session.Abandon();
}
}

Ниже я заполняю gridview

protected void FillGrid()
{
if (!string.IsNullOrEmpty(Session["Username"] as string) && !string.IsNullOrEmpty(Session["DistrictId"] as string))
{

string defaultdate = "01/01/1900";
bo.Dateused = DateTime.ParseExact(defaultdate.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);
bo.Dateused1 = DateTime.ParseExact(defaultdate.ToString(), "dd/MM/yyyy", CultureInfo.InvariantCulture);


if (Session["RoleId"].ToString() == "2")
{
if (ddl_District.SelectedValue.ToString() == "0")
{
bo.Num1 = 0;
}
else
{
bo.Num1 =int.Parse(ddl_District.SelectedValue.ToString());
}
}
else
{
bo.Num1 = int.Parse(Session["DistrictId"].ToString());// 
}
bo.Num2 = 1;//Paravalue
bo.Para1 = Session["Username"].ToString();//UserName
bo.Num3 = 0;//CCId
DataTable dt = bl.Get_MisReports(bo);
gv_lastlogindetails.DataSource = dt;
gv_lastlogindetails.DataBind();
if (dt.Rows.Count > 0)
{

}
else
{
DataTable dtempty = new DataTable();
gv_lastlogindetails.DataSource = dtempty;
gv_lastlogindetails.DataBind();
if (Session["RoleId"].ToString() == "2")//IF SIC 
{
pnl_district.Attributes.CssStyle.Add("display", "block");
}
else
{
pnl_district.Attributes.CssStyle.Add("display", "none");
}
}
}
else
{
Response.Redirect("sessionexpired.aspx");
Session.Clear();
Session.Abandon();
}
}

Мой вопрос: я хочу оставить SortExpression как первые четыре и такие же, как последние четыре поля шаблона. Первые четыре сортировки работают нормально, но я хочу добавить последние четыре сортировки выражение, которое заполняется из поля, связанного со строкой строки.

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