在DataBridComplete在DataGridView中触发时设置列宽时,我得到一个NullReferenceError。 DGV使用在步骤(1)中预先准备的DataTable,然后在步骤(2)中设置为.DataSource。步骤(3)是格式化列宽,因为直到DataBindingComplete之后才能这样做。
简化代码:
//STEP 2/3: Move data into the listBox
public void setupListBox() {
m_Initialized=true; //DataBindingComplete now unsuppressed
listBox.DataSource=m_datatable; //Next, "Data Binding Complete" will fire
}
//STEP 3/3: Data finished being moved, do col widths and headertext
private void listBox_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) {
if(!m_Initialized) return; //Doesn't work. This still gets called multiple times
DataGridViewColumn lCol;
for(byte lColIndex = 0;lColIndex<m_cols.Count();lColIndex++) {
lCol=listBox.Columns[lColIndex];
lCol.HeaderText=m_datatable.Columns[lColIndex].Caption; //apply header texts from datatable to the GridView, which stupidly doesn't pick them up
Debug.WriteLine(lColIndex.ToString()+": "+m_cols[lColIndex].name +
"CurrentWidth:" +lCol.Width + ", New: " +m_cols[lColIndex].width); //Everything is as expected
lCol.Width=m_cols[lColIndex].width; // ExcepttionNullReference here
//Note that the Debug.WriteLine above proves that lCol.Width exists and lCol is valid (etc)
}
}
关闭DataBindingComplete抑制(m_Initialized = true)后,DataBindingComplete被调用两次*,e.ListChangedType值为“Reset”。 (见:https://msdn.microsoft.com/en-us/library/system.componentmodel.listchangedtype(v=vs.110).aspx)。 *我希望listBox.DataSource = m_datatable有一个回调,当listBox.DataSource完成设置时可以捕获它。 DataBindingComplete过于虚假。
[注意:我循环使用cols而不是使用forEach的原因是我必须记录第一个可见列的索引(所以我可以稍后设置SelectedCells),但forEach不会给我索引号。该错误实际发生在第5列,这是第一个获得Width设置的列 - 其他是visible = false或DataGridViewAutoSizeColumnMode.Fill)。]
StackOverflow充满了线程,人们正试图处理重复的DataBindingComplete激活。此外,很多人尝试在DataBindingComplete之前设置宽度;但我没有犯这个错误。并且,在我的抑制技术之后,我只获得了两次DataBindingComplete的发射(许多其他人获得5次或10次发射)。但是没有什么能解决为什么在DataBindingComplete之后宽度不可用的问题?