Page 1 of 2

clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 12:10 pm
by jsira2003@yahoo.com
I want to clear the columns in a datagridview without closing the form. I tried many many ways with no success. This should be easy to do but it wasn't. I do not have a datasource as you will see in the sample code.

$comboboxMotors_SelectedIndexChanged={
#TODO: Place custom script here

[int]$index = $comboboxMotors.SelectedIndex
$textboxFreeSpeed.Text = $motors[$index].FreeSpeed
$textboxStallTorque.Text = $motors[$index].StallTorque
$textboxFreeCurrent.Text = $motors[$index].FreeCurrent
$textboxStallCurrent.Text = $motors[$index].StallCurrent
$textboxNumMotors.Text = 1
$textboxSpecVoltage.Text = $motors[$index].SpecVoltage
$comboboxAltVoltage.Text = $motors[$index].SpecVoltage


[int]$numberOfMotors = 1
[float]$Driving = 1
[float]$Driven = 1
[float]$altVoltage = $motors[$index].SpecVoltage
#take record out of hash table and put into array
[array]$selectedMotor = @()
$selectedMotor = $($motors[$index].MakeModel), $($motors[$index].SpecVoltage), $($motors[$index].FreeSpeed), $($motors[$index].FreeCurrent), $($motors[$index].StallTorque), $($motors[$index].StallCurrent), $($motor[$index].gear1), $($motor[$index].gear2), $($motor[$index].gear3), $($motor[$index].gear4), $($motor[$index].gear5), $($motor[$index].gear6)
#[System.Windows.Forms.MessageBox]::Show("$($motors[$index])", "motors index")
[array]$motorStats = MotorOperation $selectedMotor $numberOfMotors $Driving $Driven $altVoltage

$dataGridView = New-Object System.Windows.Forms.DataGridView

$dataGridView.Size = New-Object System.Drawing.Size(640, 400)

#$dataGridView.AutoSize = $true
$dataGridView.Location = "10,220"
$dataGridView.AutoResizeColumns = $true
$formMotorStats.Controls.remove($dataGridView)
$formMotorStats.Controls.Add($dataGridView)
#Create an unbound DataGridView by declaring a column count.
$dataGridView.ColumnCount = 7
$dataGridView.ColumnHeadersVisible = $true
$dataGridView.ColumnHeadersHeightSizeMode = 'AutoSize'
#Set the column header names.

$dataGridView.Columns[0].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[0].Name = "Amps"
$dataGridView.Columns[1].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[1].Name = "Torque (N-m)"
$dataGridView.Columns[2].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[2].Name = "RPM"
$dataGridView.Columns[3].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[3].Name = "Output (W)"
$dataGridView.Columns[4].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[4].Name = "Input (W)"
$dataGridView.Columns[5].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[5].Name = "Efficiency %"
$dataGridView.Columns[6].DefaultCellStyle.Alignment = 'MiddleCenter'
$dataGridView.Columns[6].Name = "Power %"

#freeze first column
$dataGridView.Columns[0].Frozen = $true


[array]$allRows = @()

foreach ($motorStat in $motorStats)
{
$Rows = New-Object PSObject
$Rows | Add-Member -MemberType NoteProperty -Name Current -Value $([math]::ROUND($motorStat.current, 2))
$Rows | Add-Member -MemberType NoteProperty -Name Torque -Value $([Math]::Round($motorStat.Torque,3))
$Rows | Add-Member -MemberType NoteProperty -Name RPM -Value $([Math]::Round($motorStat.RPM,2))
$Rows | Add-Member -MemberType NoteProperty -Name PowerOutput -Value $([System.Math]::Round($motorStat.PowerOutput,2))
$Rows | Add-Member -MemberType NoteProperty -Name PowerInput -Value $([System.Math]::Round($motorStat.PowerInput,2))
$Rows | Add-Member -MemberType NoteProperty -Name PowerEfficiency -Value $([System.Math]::Round($motorStat.PowerEfficiency,2))
$Rows | Add-Member -MemberType NoteProperty -Name PowerPercentage -Value $([System.Math]::Round($motorStat.PowerPercentage,3))
$allRows += $Rows
}

foreach ($allRow in $AllRows)
{
$dataGridView.Rows.Add($allRow.Current, $allRow.Torque, $allRow.RPM, $allRow.PowerOutput, $allRow.PowerInput, $allRow.PowerEfficiency, $allRow.PowerPercentage)
}

$dataGridView.AutoResizeColumns('AllCells')
$dataGridView.ReadOnly = $true

}

Thanks for your help,
John

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 12:57 pm
by davidc
[TOPIC MOVED TO THE POWERSHELL GUIS FORUM BY MODERATOR]

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 1:09 pm
by jvierra
To clear rows of a DGV just do this:

$datagridview1.Rows.Clear()

This will remove all data and retain the column definitions. No need to re-create verything.

To add data to a DGV just create a custom "Select-Object" that provides the objects as required and assign to the "DataSource".

$rows = $motorstats | select <computed properties>
$datagridview1.DataSource = [arraylist]$rows

The columns must be defined with a "datamembername" property that matches the objects property names.

You can also just let the DGV auto-create the columns.

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 1:47 pm
by jsira2003@yahoo.com
I tried that line of code many times. Maybe I didn't put it is the right spot. Nevertheless it did not work.

John

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 1:55 pm
by jvierra
Without some idea of how you are doing this I cannot be of much help.

Start by being sure you ae loading the grid with the "DataSource" property. That allows the grid to correctly build the rows.

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 2:01 pm
by jvierra
If the rows are locked by the creation method this will work:

$datagridview1.DataSource = $null

Re: clearing data in a datagridview without exiting form

Posted: Wed Oct 10, 2018 5:30 pm
by jvierra
The attached sampler demonstrates the many ways to dynamically load and reload a DGV.

Re: clearing data in a datagridview without exiting form

Posted: Thu Oct 11, 2018 7:08 am
by jsira2003@yahoo.com
I tried both the $dataGridView.DataSource = [System.Collections.Array]$motorStats and this worked. However the $dataGridView.Rows.Clear() and also the $dataGridView.DataSource = $null did not clear the table. I should note I did not use a datagridview object from the powershell studio toolbox. Here is the code presently with the clear and nulls removed:

$comboboxMotors_SelectedIndexChanged={
#TODO: Place custom script here
[int]$index = $comboboxMotors.SelectedIndex
$textboxFreeSpeed.Text = $motors[$index].FreeSpeed
$textboxStallTorque.Text = $motors[$index].StallTorque
$textboxFreeCurrent.Text = $motors[$index].FreeCurrent
$textboxStallCurrent.Text = $motors[$index].StallCurrent
$textboxNumMotors.Text = 1
$textboxSpecVoltage.Text = $motors[$index].SpecVoltage
$comboboxAltVoltage.Text = $motors[$index].SpecVoltage


[int]$numberOfMotors = 1
[float]$Driving = 1
[float]$Driven = 1
[float]$altVoltage = $motors[$index].SpecVoltage
#take record out of hash table and put into array
[array]$selectedMotor = @()
$selectedMotor = $($motors[$index].MakeModel), $($motors[$index].SpecVoltage), $($motors[$index].FreeSpeed), $($motors[$index].FreeCurrent), $($motors[$index].StallTorque), $($motors[$index].StallCurrent), $($motor[$index].gear1), $($motor[$index].gear2), $($motor[$index].gear3), $($motor[$index].gear4), $($motor[$index].gear5), $($motor[$index].gear6)
#[System.Windows.Forms.MessageBox]::Show("$($motors[$index])", "motors index")

[System.Collections.ArrayList]$motorStats = MotorOperation $selectedMotor $numberOfMotors $Driving $Driven $altVoltage

$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Size = New-Object System.Drawing.Size(640, 400)

#$dataGridView.AutoSize = $true
$dataGridView.Location = "10,220"
$dataGridView.AutoResizeColumns = $true

$formMotorStats.Controls.Add($dataGridView)

#Create an unbound DataGridView by declaring a column count.

$dataGridView.ColumnHeadersVisible = $true
$dataGridView.ColumnHeadersHeightSizeMode = 'AutoSize'

$dataGridView.DataSource = [System.Collections.ArrayList]$motorStats


$dataGridView.AutoResizeColumns('AllCells')
$dataGridView.ReadOnly = $true

}

Re: clearing data in a datagridview without exiting form

Posted: Thu Oct 11, 2018 9:55 am
by jvierra
I suggest that you add the DGV in the designer and set the values. You can then easily manage the DGV using normal methods. There is no gain by recreating the DGV each time.

Also we would add the objects to the ComboBox and just retrieve them from the SelectedItem.

On "index changed" the "SelectedItem" contains the complete object.

What is "MotorOperation"? What does it return?

Re: clearing data in a datagridview without exiting form

Posted: Thu Oct 11, 2018 10:09 am
by jsira2003@yahoo.com
MotorOperation returns an entire table to be displayed in the grid. The combobox selection directs which motor operation is to be analyzed and send the appropriate parameters to the function. The function is working correctly and does not need to be changed. It is just that everytime a new motor is selected the table should be cleared and re-created with whatever is returned by the MotorOperation function. The MotorOperation function works correctly. The only thing that is funky is the grid and the ability to clear it on demand. I like the datasource. That works for me. When I tried to create a datasource object with the gui, it would not let me add the data source in the gui. I suspect I would have to define that in my application.

John