如何编辑Gridview的标题。 (创建自定义标题) [英] How to Edit the Headers of the Gridview. (Creating Custom Headers)
问题描述
我有一个gridview,其中有6列,即:PRODUCTS,RETAIL OUTLET,DATE,TIME,QUANTITY& AMOUNT和我的数据库表中的列名相同。
主要的问题是当在gridview中填充数据时一切正常并且完美,我只需要执行产品列已经' CNG'因此,数量列名称应该是'数量 - Kg(s)'和如果产品列具有'PETROL,DIESEL或HI-OCTANE',那么它应该将列数量的标题显示为'QUANTITY - Ltr'
请帮忙解决这个问题。
我正在创建一个自定义标题和小元素和小计row_created和row_databound事件。
我知道其中一个事件必须有一个解决方案,因为这是我的代码如下:
I have a gridview in which has 6 columns i.e: PRODUCTS, RETAIL OUTLET, DATE, TIME, QUANTITY & AMOUNT and same as the column names in my database table.
The main is issue is when data is populated in the gridview everything works fine and perfect, I ONLY NEED TO IMPLEMENT THAT IF THE PRODUCT COLUMN HAS 'CNG' IN IT THEN THE QUANTITY COLUMN NAME SHOULD BE 'QUANTITY - Kg(s)' AND ELSE IF THE PRODUCT COLUMN HAS 'PETROL,DIESEL or HI-OCTANE' THEN IT SHOULD DISPLAY THE HEADER OF COLUMN QUANTITY TO 'QUANTITY - Ltr'
Please help in this issue.
I am creating a custom header and grandtotals and subtotals in the row_created and row_databound events.
And I know there must be a solution in one of those events as here is my code in the following:
using System;
public partial class view_rep : System.Web.UI.Page
{
string strPreviousRowID = string.Empty;
string productype = string.Empty;
int intSubTotalIndex = 1;
double dblSubTotalTotalBilled = 0;
double dblGrandTotalTotalBilled = 0;
string[] arr;
int myr;
protected void Page_Load(object sender, EventArgs e)
{
}
//HERE IS THE MAIN SCIENCE..
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
Label lblamount = (Label)e.Row.FindControl("lbl_Amount");
if (e.Row.RowType == DataControlRowType.DataRow)
{
strPreviousRowID = DataBinder.Eval(e.Row.DataItem, "product").ToString();
productype = DataBinder.Eval(e.Row.DataItem, "product").ToString();
double dblTotalBilled = Convert.ToDouble(DataBinder.Eval(e.Row.DataItem, "amount").ToString());
dblSubTotalTotalBilled += dblTotalBilled;
dblGrandTotalTotalBilled += dblTotalBilled;
}
if (e.Row.RowIndex >= 0)
{
double dblTotalBilled = Convert.ToDouble(DataBinder.Eval(e.Row.DataItem, "amount").ToString());
lblamount.Text = string.Format("{0:#,#0.00}", dblTotalBilled);
}
}
protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
bool IsTotalRowNeedToAdd = false;
bool IsGrandTotalRowNeedtoAdd = false;
if ((strPreviousRowID != string.Empty) && (DataBinder.Eval(e.Row.DataItem, "product") != null))
if (strPreviousRowID != DataBinder.Eval(e.Row.DataItem, "product").ToString())
IsTotalRowNeedToAdd = true;
if ((strPreviousRowID != string.Empty) && (DataBinder.Eval(e.Row.DataItem, "product") == null))
{
IsTotalRowNeedToAdd = true;
IsGrandTotalRowNeedtoAdd = true;
intSubTotalIndex = 0;
}
if ((strPreviousRowID == string.Empty) && (DataBinder.Eval(e.Row.DataItem, "product") != null))
{
GridView grdViewProducts = (GridView)sender;
GridViewRow SubTotalRow = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Insert);
TableCell HeaderCell = new TableCell();
HeaderCell.Text = "<div>" + " Fuel Type: " + DataBinder.Eval(e.Row.DataItem, "product").ToString() + "</br>" +
" Card No: " + DataBinder.Eval(e.Row.DataItem, "card_no").ToString() +
"</div>";
HeaderCell.ColumnSpan = 5;
HeaderCell.CssClass = "GroupHeaderStyle";
SubTotalRow.Cells.Add(HeaderCell);
grdViewProducts.Controls[0].Controls.AddAt(e.Row.RowIndex + intSubTotalIndex, SubTotalRow);
intSubTotalIndex++;
}
if (IsTotalRowNeedToAdd)
{
GridView grdViewProducts = (GridView)sender;
// Creating a Row
GridViewRow SubTotalRow = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Insert);
//Adding Total Cell
TableCell HeaderCell = new TableCell();
HeaderCell.Text = "Sub Total";
HeaderCell.ColumnSpan = 4; // For merging first, second row cells to one
HeaderCell.CssClass = "SubTotalRowStyle";
SubTotalRow.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
HeaderCell.Text = string.Format("{0:#,##0.00}", dblSubTotalTotalBilled);
HeaderCell.CssClass = "SubTotalRowStyle";
SubTotalRow.Cells.Add(HeaderCell);
grdViewProducts.Controls[0].Controls.AddAt(e.Row.RowIndex + intSubTotalIndex, SubTotalRow);
intSubTotalIndex++;
// Repeating Header Row before every product detail.
GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
HeaderCell = new TableCell();
HeaderCell.Controls.Add(new Label { Text = "Retail Outlet" });
HeaderCell.CssClass = "headergv";
HeaderCell.Height = Unit.Parse("16px");
row.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
HeaderCell.Controls.Add(new Label { Text = "Date" });
HeaderCell.CssClass = "headergv";
HeaderCell.Height = Unit.Parse("16px");
row.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
HeaderCell.Controls.Add(new Label { Text = "Time" });
HeaderCell.CssClass = "headergv";
HeaderCell.Height = Unit.Parse("16px");
row.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
// HERE IS THE CONDITION APPLIED AND IT WORKS FINE.. BUT WHEN THE PRODUCT HAS
// ONLY PETROL THEN IT IS SHOWING THE QUANTITY - Kg(s)....WANT TO MAKE IT DYNAMIC.
if (strPreviousRowID == "PETROL" || strPreviousRowID != "CNG")
{
HeaderCell.Controls.Add(new Label { Text = "Quantity - Kg(s)" });
}
else
{
HeaderCell.Controls.Add(new Label { Text = "Quantity - Ltr(s)" });
}
// ***********************************
HeaderCell.CssClass = "headergv";
HeaderCell.Height = Unit.Parse("16px");
row.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
HeaderCell.Controls.Add(new Label { Text = "Amount" });
HeaderCell.CssClass = "headergv";
HeaderCell.Height = Unit.Parse("16px");
row.Cells.Add(HeaderCell);
grdViewProducts.Controls[0].Controls.AddAt(e.Row.RowIndex + intSubTotalIndex, row);
intSubTotalIndex++;
// *************************
if (DataBinder.Eval(e.Row.DataItem, "product") != null)
{
GridViewRow SubTotalRow1 = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Insert);
TableCell HeaderCell1 = new TableCell();
HeaderCell1.Text = "<div>" + " Fuel Type: " + DataBinder.Eval(e.Row.DataItem, "product").ToString() + "</br>" +
" Card No: " + DataBinder.Eval(e.Row.DataItem, "card_no").ToString() +
"</div>";
HeaderCell1.ColumnSpan = 5;
HeaderCell1.CssClass = "GroupHeaderStyle";
SubTotalRow1.Cells.Add(HeaderCell1);
grdViewProducts.Controls[0].Controls.AddAt(e.Row.RowIndex + intSubTotalIndex, SubTotalRow1);
intSubTotalIndex++;
}
dblSubTotalTotalBilled = 0;
}
if (IsGrandTotalRowNeedtoAdd)
{
GridView grdViewProducts = (GridView)sender;
GridViewRow GrandTotalRow = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Insert);
TableCell HeaderCell = new TableCell();
HeaderCell.Text = "Grand Total";
HeaderCell.HorizontalAlign = HorizontalAlign.Left;
HeaderCell.ColumnSpan = 4; // For merging first, second row cells to one
HeaderCell.CssClass = "GrandTotalRowStyle";
GrandTotalRow.Cells.Add(HeaderCell);
HeaderCell = new TableCell();
HeaderCell.Text = string.Format("{0:#,##0.00}", dblGrandTotalTotalBilled);
HeaderCell.CssClass = "GrandTotalRowStyle";
GrandTotalRow.Cells.Add(HeaderCell);
grdViewProducts.Controls[0].Controls.AddAt(e.Row.RowIndex, GrandTotalRow);
}
}
}
推荐答案
尝试切换循环
try switch loop
switch (QtyType)
{
case "CNG":
//code for header Text
break;
case "Petrol":
//code for header Text
break;
Default :
//code for header Text
break;
}
您可以将字符串比较替换为contains并使用switch-case结构。
You can replace the string comparison with a "contains" and use a switch-case construct .
var QtyType = //datarow value of your product column consists of the type;
if (string.Contains(QtyType,StringComparison.OrdinalIgnoreCase))
{
switch (QtyType)
{
case "CNG":
//Assign header Text
break;
case "Petrol":
//Assign header Text
break;
Default :
//Assign header Text
break;
}
}
如果有更多类型,您可以考虑将其重构为单独的方法。
希望这会有所帮助。
You can think of refactoring this to a seperate method in case there are more types.
Hope this helps.
这篇关于如何编辑Gridview的标题。 (创建自定义标题)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!