如何在Python中为DataGridView动态添加行(无额外依赖)
解决DataGridView动态添加行的参数适配问题
我刚遇到过几乎一模一样的问题!在Python中调用.NET的params风格方法时,直接传列表或元组会被当成单个参数处理,这就是为什么你所有内容都挤在第一列的原因。
问题根源
.NET的DataGridView.Rows.Add(params object[] values)方法设计为接受可变数量的参数(对应每一列的值),但Python不会自动展开序列(比如signals[j]这个列表/元组),而是把整个序列作为第一个参数传入,自然就都显示在第一列了。
解决方案
用Python的**解包操作符***来展开你的signals[j],这样序列里的每个元素都会被当作单独的参数传递给Add方法,完美适配任意数量的列。
修改你代码中的循环部分:
for j in range(len(signals)): # 用*解包signals[j],每个元素对应一列 self._dataGridView1.Rows.Add(*signals[j])
修改后的完整代码
import clr clr.AddReference('System.Windows.Forms') clr.AddReference('System.Drawing') clr.AddReference('System.Data') clr.AddReference('RevitAPIUI') from Autodesk.Revit.UI import TaskDialog from System.Windows.Forms import * from System.Drawing import ( Point, Size, Font, FontStyle, GraphicsUnit ) from System.Data import DataSet from System.Data.Odbc import OdbcConnection, OdbcDataAdapter msgBox = TaskDialog headers = IN[0] signals = IN[1] class DataGridViewQueryForm(Form): def __init__(self): self.Text = 'Signals' self.ClientSize = Size(942, 255) self.MinimumSize = Size(500, 200) self.setupDataGridView() def setupDataGridView(self): self._dataGridView1 = DataGridView() self._dataGridView1.AllowUserToOrderColumns = True self._dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize self._dataGridView1.Dock = DockStyle.Fill self._dataGridView1.Location = Point(0, 111) self._dataGridView1.Size = Size(506, 273) self._dataGridView1.TabIndex = 3 self._dataGridView1.ColumnCount = len(headers) self._dataGridView1.ColumnHeadersVisible = True for i in range(len(headers)): self._dataGridView1.Columns[i].Name = headers[i] # 关键修改:用*解包每个信号条目 for j in range(len(signals)): self._dataGridView1.Rows.Add(*signals[j]) self.Controls.Add(self._dataGridView1) Application.Run(DataGridViewQueryForm())
额外提示
- 确保每个
signals[j]的元素数量和你设置的列数(len(headers))完全一致,否则可能会抛出参数不匹配的异常,或者显示内容错位。 - 这个方法不需要引入任何额外包,完全依赖你已经引用的.NET类库,非常适合在Revit Dynamo的多用户环境中使用。
内容的提问来源于stack exchange,提问作者fidjeland
相关产品推荐
相关产品推荐

