There is a gridview which includes 6 columns. I bound the data to some columns. For example, 3 and 5 th columns have data.
I want to show There is 2 data in first columns if there is 3 data in separate columns I want to write 3 in the first column.
Column1 | Column2 | Column3 | Column4 | Column5 | Column6
2 | | stack | | overflow |
4 | sta | ck | over | flow |
1 | | | | | stcvrflw
How can I do it?
I populate the grid
e.Row.Cells[i].Text = html;
and html variable includes < table>.... some values come from db.
After you populate the grid:
for (int i = 0; i < gv.Rows.Count; i++)
{
valueCount=0;
for (int j = 1; j < gv.Columns.Count; j++)
{
if (gv.Rows[i].Cells[j].ToString()!="")
valueCount++;
}
gv.Rows[i].Cells[0].Text =valueCount.ToString();
}
Related
I am currently Creating a ASCII table builder which is required for some automated database reports in a GXP environment.
Given that I have table rows with a width of n such as:
| this | is | an | example | row |
|<-- width = 32 -->|
I now want to add headers and spacers such as:
#================================#
| this | is | an | example | row |
|--------------------------------|
| 1 | 2 | 3 | 4 | 5 |
| 3 | 9 | 77 | 327814 | 2 |
|--------------------------------|
of course I could do this in the following way:
List<string> asciiTable = new List<string();
string topBorder = "#";
string otherBorder = "|";
for (int i = 1; i == n; i++)
{
topBorder += "=";
otherBorder += "-";
}
topBorder += "#";
otherBorder += "|";
asciiTable.Add(topBorder);
but I hope there is something such as:
List<string> asciiTable = new List<string>();
asciiTable.Add("#" + /* add("=",n) */ + "#");
You could use new String('=', n); which will create a string with the character '=' repeated n times.
I need display sum of Columns total (Grand Total) in GridView Footer in ASP.Net using C#.
I have two problems:
I can't apply the css style in GridView Footer;
I have error
Specified cast is not valid.
when add the Sum of Tot2.
How to resolve this?
Thank you advance for any help.
This is SQL query:
sql = " SELECT ZN, ";
sql += " IFNULL(Tot1,0) AS Tot1, ";
sql += " IFNULL(Tot2,0) AS Tot2 ";
sql += " FROM ";
sql += " doTable ";
sql += " ORDER BY ";
sql += " Tot1 DESC; ";
+----+------+------+
| Zn | Tot1 | Tot2 |
+----+------+------+
| ZO | 3 | 0 |
| ZO | 3 | 0 |
| ZO | 2 | 1 |
| ZO | 2 | 0 |
| ZO | 2 | 0 |
| ZO | 2 | 0 |
| ZO | 2 | 0 |
| ZO | 1 | 0 |
| ZO | 1 | 1 |
| ZO | 1 | 0 |
+----+------+------+
10 rows in set
This the code-behind:
OdbcDataAdapter adapter = new OdbcDataAdapter(command);
adapter.Fill(dsProducts);
gvProducts.Columns[1].FooterText = "Total";
gvProducts.Columns[2].ItemStyle.HorizontalAlign = HorizontalAlign.Right;
gvProducts.Columns[2].ItemStyle.CssClass = "ddl_Class_new";
gvProducts.Columns[2].FooterText = dsProducts.Tables[0].AsEnumerable().Select(x => x.Field<Int32>("Tot1")).Sum().ToString();
gvProducts.Columns[3].ItemStyle.HorizontalAlign = HorizontalAlign.Right;
gvProducts.Columns[3].ItemStyle.CssClass = "ddl_Class_new";
gvProducts.Columns[3].FooterText = dsProducts.Tables[0].AsEnumerable().Select(x => x.Field<Int32>("Tot2")).Sum().ToString();
First, you set the css of the footer with FooterStyle.CssClass
gvProducts.Columns[3].FooterStyle.CssClass = "ddl_Class_new";
And specified cast means that there are fields in Tot1 or Tot2 that are not convertible to Int32. Probably because you use IFNULL in your query, change that to ISNULL if you use MS SQL or check if the data in aspnet is what you actually expect it to be by debugging.
I am trying to figure out a good way to remove empty values from rows and merge row2 to row1, row4 to row2 in a datatable.
DataTable with Empty rows to merge
---------------------
| Column1 | Column2 |
----------------------
ROW1 | XYZ | |
ROW2 | | ABC |
ROW3 | MNQ | |
ROW4 | | PQR |
Final datatable with merged rows
_____________________
| Column1 | Column2 |
----------------------
ROW1 | XYZ | ABC |
ROW2 | MNQ | PQR |
Can somebody help me accomplish this in C#?
Try to create two array that will store a column1 value and column2 value.
In loop go through all datatable rows and insert all not empty rows from column1 to array1 and rows from column2 to array2. Then on the end create new datatable that will have rows taked from array1 and array2.
For example in pseudocode.
var array1;
var array2;
for(var row in datatable)
{
if(row[column1] != null or empty)array1.push(row[column1].value);
if(row[column2] != null or empty)array2.push(row[column2].value);
}
and in the end (first check what array is biger).For example i assuming that array1 is bigger;
var newDatatable;
for(int i=0; i<array1.count; i++)
{
var row = new row;
newDatatable.row[column1].addRowValue(array1[i])
if(array2.count < i){
newDatatable.row[column2].addRowValue(array2[i])
}
}
I've seen this article http://asp.net-informations.com/gridview/newrow.htm and this post http://forums.asp.net/p/1534978/3725419.aspx#3725419 and I've done it for have that separator row collapsible with jquery and it's working great in display mode. The problems occuring when try to do something else with gridview, because there's a weird behaviour.. I've add a simple button that have just to set a radiobutton that's in every gridview row (except in the new added GroupHeaders rows). Then if I have added two new row he is skipping setting the last two rows in the GridView..
public void AddNewRow(object sender, GridViewRowEventArgs e)
{
GridView GridView1 = (GridView)sender;
GridViewRow NewTotalRow = new GridViewRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
TableCell HeaderCell = new TableCell();
HeaderCell.Attributes.Add("onclick", "collapsible('" + rowgroup + "')");
NewTotalRow.Cells.Add(HeaderCell);
TableCell HeaderCellIndex = new TableCell();
int indexCorrente = e.Row.RowIndex + index;
HeaderCellIndex.Text = indexCorrente.ToString();
NewTotalRow.Cells.Add(HeaderCellIndex);
GridView1.Controls[0].Controls.Add(NewTotalRow);
}
protected void gdDettaglio_RowCreated(object sender, GridViewRowEventArgs e)
{
bool newRow = false;
if ((DataBinder.Eval(e.Row.DataItem, "Stato") != null))
{
if (statoCorrente != Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "Stato").ToString()))
newRow = true;
}
if (newRow)
{
AddNewRow(sender, e);
}
}
Printing the row index (just to check it) next to each row I'm displaying this situation (with two GroupHeader rows added):
(The index are as they are printing them in gdDettaglio_RowCreated for GroupHeadrs rows and on gdDettaglio_OnDataBound for the other rows)
-----------------------------------------
| HEADER |
|---------------------------------------|
-----------------------------------------
| Gruppo 1 | index -1 |
|---------------------------------------|
| grp1 | x | blablabla | | index 0 |
| grp1 | y | blablabla | | index 1 |
| grp1 | z | blablabla | | index 2 |
| grp1 | x | blablabla | | index 3 |
| grp1 | x | blablabla | | index 4 |
|---------------------------------------|
| Gruppo 2 | index -1 |
|---------------------------------------|
| grp2 | x | blablabla | | index 5 |
| grp2 | y | blablabla | | index 6 |
| grp2 | z | blablabla | | index 7 |
| grp2 | z | blablabla | | index 8 |
| grp2 | z | blablabla | | index 9 |
| grp2 | z | blablabla | | index 10 |
-----------------------------------------
in the button code I've just:
foreach (GridViewRow riga in gdDettaglio.Rows)
{
if (riga.RowType == DataControlRowType.DataRow)
{
RadioButtonList rad = (RadioButtonList)riga.FindControl("rad");
rad.SelectedValue = "True";
}
}
UPDATE:
Doing the same thing on jquery work, it affects all the row:
function accettaTutte() {
$("#<%=gdDettaglio.ClientID%> tr:has(td)").each(function () {
var items = $(this).find("[id$='radDaPa'] input:radio'");
for (var i = 0; i < items.length; i++) {
if (items[i].value == 'True') {
if (!(items[i].checked)) {
items[i].checked = true;
}
break;
}
}
});
return false;
}
But I still need to do a foreach on that gridview, to update db, some idea on what could try to do? On every row I've also a "single row save" ImageButton, but clicking on it on the last two rows it's not firing the RowCommand event... It's like the two added GroupHeader rows are pushing out the last two data rows, no matter about the index.. If I click the ImageButton on the row with displayed (using Text='<%#Container.DataItemIndex%>') rowIndex 2, in the rowCommand it become rowIndex 3, but it modified the right row, the one I've clicked.. If i do the same on row 7, it become 9.. But if forced it to get value on rowIndex 11, U'm getting ArgumentOutOfRangeException, because Rows.Count It's still 11..
OK, now I am adding to the list that is GridView DataSource as many empty elements as are the GroupHeaders rows, so GridView.Rows.Count is enough to get all the rows..
I want to merge table but i don't know how. I have already tried many times but still can't get the right solution. Right now my gridview is like this :
Data 1 | Data 1 | Data 1 | Data 1
Data 1 | Data 1 | Data 1 | Data 1
Data 2 | Data 2 | Data 2 | Data 2
Data 2 | Data 2 | Data 2 | Data 2
And I want the gridview to be like this :
Data 1 | Data 1 | Data 1 | Data 1
| Data 1 | Data 1 |
Data 2 | Data 2 | Data 2 | Data 2
| Data 2 | Data 2 |
How to merge cells with equal values in a GridView
this will help you
The code that merges the cells is very short:
public class GridDecorator
{
public static void MergeRows(GridView gridView)
{
for (int rowIndex = gridView.Rows.Count - 2; rowIndex >= 0; rowIndex--)
{
GridViewRow row = gridView.Rows[rowIndex];
GridViewRow previousRow = gridView.Rows[rowIndex + 1];
for (int i = 0; i < row.Cells.Count; i++)
{
if (row.Cells[i].Text == previousRow.Cells[i].Text)
{
row.Cells[i].RowSpan = previousRow.Cells[i].RowSpan < 2 ? 2 :
previousRow.Cells[i].RowSpan + 1;
previousRow.Cells[i].Visible = false;
}
}
}
}
}
The last action is to add an OnPreRender event handler for the GridView:
protected void gridView_PreRender(object sender, EventArgs e)
{
GridDecorator.MergeRows(gridView);
}