I am doing SAP automation, there i am reading data from GUIGridview and adding to a DataTable using a for loop. But after 34 rows every values are empty. Then I tried with setting the current cell using a condition
if (rowindex % 34== 0)
grd.SetCurrentCell(rowindex, grd.FirstVisibleColumn);
After that i am able to get the values of 35, 36th row but again then blank values from there. Total i am having 91 rows.
The backend doesn't send all the grid rows to the frontend, only the ones currently viewed.
You must scroll the grid via the property FirstVisibleRow, and use the other properties RowCount and VisibleRowCount to scroll only when required.
Example:
for (int rowindex = 0; rowindex < grd.RowCount; rowindex = rowindex + 1)
{
// Position at top if first time or scroll to display next page
if ( rowindex % grd.VisibleRowCount == 0 )
{
grd.FirstVisibleRow = rowindex
}
// Process the line
...
}
More information: SAP Library - GuiGridView
Related
In Our assignment we were given a task to create a new spreadsheet program with a 26 x 26 grid of textboxes without importing anything and make use of array (in my case I Used array of objects).
I created a 2 d array of objects containing size of grid (27x27). the reason of it being 27 instead of 26 is because the first row and column is to show the ABCDE etc and 12345 etc of the rows and columns.
now the rows indexation I had no problem because it is numeric. however, the letters I solved by creating a string array with alphabet from a to z and entering them through a for loop and it worked.
Now the next step is to be able to link the cells, however, I am a bit stumped, because people told me I have to use Ascii or smthin.
Can anyone help me plz on how to achieve the cell links?
I have been able to past the name of each cell using this code but I fear I just filled the .Text of the cells not the cells name per se:
for (int x = 1; x < TwoDArrayCells.GetLength(0); x++) //nested loop to create the grid of textboxes.
{
for (int y = 1; y < TwoDArrayCells.GetLength(1); y++)
{
Cells CellFields = new Cells(Name = $"{AlphabetRow[x]}{y}", x, y + 3); // called a new cell named CellFields.
CellFields.Text = Name;//Change to location if you wise to take
this.Controls.Add(CellFields);
}
}
The result I would like is to be able to after this be able to link cells. meaning if I insert in a text box A1 + A2 it knows that a1 is the first box in the first row of first column and the a2 is the box in the second row of the first column.
Assuming that Columns can be A-Z only (Capitals), You can extract the column index and row index as follows:
Given a cell, string cell = "A2";
- the column index: int column = cell[0] - 'A' + 1;
- the row index: int row = Convert.ToInt32(cell.Substring(1));
Explanation: for the column, take the first letter, subtract it from 'A' (the subtraction will be performed on the assci codes of the characters) and add 1 since your actual cells are stored starting from index 1. for the row, just parse the rest of the string to int.
I have a dynamically created gridview that displays different pieces and their quantity. I want to get the total of these rows to display the total in the units column. So for example the value in the Unit column on the first row should be 190 (12 + 7 + 136 + 35)
The problem is the number of pieces can be different for each user. The example in the image has 13 pieces, but a different user might only have 5.
The units column will always be in the 9th position. So is there a way to check the value of each column after the unit column, till it reaches the end and then add those values together?
EDIT
main.Columns.Add("Units", typeof(int)).SetOrdinal(8);
foreach (DataRow row in main.Rows)
{
int total = 0;
for (int i = 9; i < main.Columns.Count - 1; i++)
{
total += row[i];
}
row["Units"] = total;
}
I try to read whole rows of a given column in listview
As I'm new in C# and use of listview I saw it does not work as List
Below is the code that I use (What I found as solution in some sites)
for (int i = 0; i < rapview.Items.Count; ++i)
{
int idx = 0;
foreach (ColumnHeader header in rapview.Columns)
{
if (header.Text == "Bak. €")
{
MyArray[0] = GeneralMethod.GetClientName(conn, rapview.Items[1].Text);
di = new ListViewItem(MyArray);
tmpView.Items.Add(di);
}
++idx;
}
}
I want to retrieve 1st column 7th column cells, but I see that rapview.Items[1].Text is empty and similar for 7th cell.
Either I miss something or given solution is not correct.
How to read the value of those cells. If possible with column number by bypassing the foreach loop?
This is a loop that copies every value in the 7th column to a list of strings.
If there is no 7th column in the row it adds an empty string.
int column = 6;
List<string> values = new List<string>();
foreach (ListViewItem lvi in rapview.Items)
if (lvi.SubItems.Count - 1 < column) values.Add("");
else values.Add(lvi.SubItems[column].Text);
Note that C# counts zero-based, so the 7th column is indexed as 6.
You could test the value in row 1 column 7 as:
Console.WriteLine("Cell 7 in row 1 contains:" + values[0]);
Note that every Item in a ListView can have its own number of SubItems. Therefore we must test it before we access it!
Also note that SubItem[0] has the same value/text as the Item!
This is my C# code to insert rows into an Excel worksheet:
for (var j = 0; j < dummies.Count; j++)
{
mySheet.Range[myRange].Insert(Excel.XlInsertShiftDirection.xlShiftDown);
}
Nothing too Earth shattering there.
However, if one of the rows below the insert has a different height to the other rows, what seems to happen is that the new row at that position keeps the same height, and so does the row which is shifted down.
So for example, before the code is run, all rows are normal height except 11 which is double the height of the others.
If I insert 10 rows at row 7, the result is that rows 11 and 21 are double height.
Inserting 1 row above makes 11 and 12 double height.
Inserting 2 rows gives the same result for rows 11 and 13, etc.
So the original double-height row always seems to keep its height, even though the height also follows the shifted-down row.
Is there a way I can specify that when I insert a row, the row height should not get left behind?
[edit]
If I insert a row manually it all works fine.
[/edit]
I found out why this is.
In the code above I'm not shifting the entire row down.
This means that the cells that aren't shifting down are keeping their original height, which is affecting the height of all the other cells in the row.
The following works:
for (var j = 0; j < dummies.Count; j++)
{
mySheet.Range[myRange].EntireRow.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
}
I am trying to populate a container with any number of controls that have the same height and width. I allow this container to be shrunk or grown by the user and the container will organize the controls so that it fits the most controls on one row as possible. Here is the code to organize it:
int row = 0;
int column = 0;
for (int i = 1; i <= controls.Count; i++)
{
controls.Values[i-1].Top = row * controls.Values[0].Height;
controls.Values[i-1].Left = column * controls.Values[0].Width;
if (i % controlsPerRow == 0)
{
// This finishes a row
row++;
column = 0;
}
else
{
column++;
}
}
The problem i run into is that on the first iteration of the loop, I will be multiplying the control height by the row and assigning that value to the control Top property. The first row is 0 and the first height is 165. 0 * 165 = 0, but the Top property contains a magical -20 after assigning the 0.
Anyone have any idea how this can happen?
You're trying to rewrite the FlowLayoutPanel.
Consider using it instead.
Also, it looks like your controls field is a Dictionary<Something, Control>.
Be aware that the iteration order of Dictionary.Values is not guaranteed, meaning that you aren't looping over the controls in the order that they were added to the dictionary.