Каждый скрипт PowerShell полностью разбирается до того, как будет выполнен первый оператор в скрипте. Неразрешимый токен имени типа внутри определения класса считается ошибкой синтаксического анализа. Чтобы решить вашу проблему, вам необходимо загрузить свои типы до того, как будет проанализировано определение класса, поэтому определение класса должно быть в отдельном файле. Например:
Main.ps1:
Add-Type -AssemblyName System.Printing
Add-Type -AssemblyName ReachFramework
. $PSScriptRoot\Class.ps1
Class.ps1:
using namespace System.Management
using namespace System.Printing
Class PrinterObject
{
[string]$Name
[PrintServer]$Server
[PrintQueue]$Queue
[PrintTicket]$Ticket
[ManagementObject]$Unit
[bool]$IsDefault
}
Другая возможность была бы вставлять Class.ps1
в виде строки и используйте Invoke-Expression
для его выполнения. Это задержит парсинг определения класса до времени, в котором доступны типы.
Add-Type -AssemblyName System.Printing
Add-Type -AssemblyName ReachFramework
Invoke-Expression @‘
using namespace System.Management
using namespace System.Printing
Class PrinterObject
{
[string]$Name
[PrintServer]$Server
[PrintQueue]$Queue
[PrintTicket]$Ticket
[ManagementObject]$Unit
[bool]$IsDefault
}
’@
Посмотрите, работает ли нижеприведенная программа аналогично тому, что у вас на уме. Обратите внимание, как я использовал флаг found
для построения логики.
(Я использовал «_» вместо символа табуляции, потому что он более виден в поле со списком.)
Здесь я предположил, что «цена» в поле со списком не единица цена. Это цена полного количества в этом поле со списком.
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.awt.event.*;
public class AddToTable {
public static void main(String[] args) {
JTable jTable = new JTable(new DefaultTableModel(
new Object[][] {},
new String[] {"Item", "Qty", "Price", "ID"}));
JComboBox<String> jComboBox = new JComboBox<>();
jComboBox.addItem("Item1 _ 2 _ 2.5 _ 101");
jComboBox.addItem("Item2 _ 5 _ 6 _ 201");
jComboBox.addItem("Item3 _ 3 _ 1.5 _ 301");
jComboBox.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Object items = jComboBox.getSelectedItem();
String name = (String) items;
String[] part = name.split(" _ ");
String item = (part[0]);
Integer qty = Integer.valueOf((part[1]));
Double price = Double.parseDouble((part[2]));
Integer ids = Integer.valueOf(part[3]);
DefaultTableModel df = (DefaultTableModel) jTable.getModel();
int rows = df.getRowCount();
boolean found = false;
for (int i = 0; i < rows; i++) {
if (ids.equals(jTable.getValueAt(i, 3))) {
Integer newQty = qty + (Integer) jTable.getValueAt(i, 1);
Double newPrice = price + (Double) jTable.getValueAt(i, 2);
jTable.setValueAt(newQty, i, 1);
jTable.setValueAt(newPrice , i, 2);
found = true;
break;
}
}
if (!found) {
df.addRow(new Object[]{item, qty, price, ids});
}
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(jComboBox, BorderLayout.NORTH);
f.getContentPane().add(new JScrollPane(jTable), BorderLayout.CENTER);
f.setBounds(300, 200, 400, 300);
f.setVisible(true);
}
}