故障查找 - DataGridView DataBindingComplete无法设置列宽

时间:2018-01-07 12:20:12

标签: c# winforms datagridview

在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之后宽度不可用的问题?

0 个答案:

没有答案