协调主/详细DataGridViews

时间:2013-01-24 22:13:17

标签: c# winforms datagridview master-detail

我在WinForms中有一对Master / Detail Datagridviews,显示来自以下类设计的信息:

public class Roads
{
   private List<CrossStreets> _crossStreets = new List<CrossStreets>();
   public string RoadName { get; set; }
   public List<CrossStreet> CrossStreets { get { return _crossStreets;} }        
}

public class CrossStreet
{
   public string CrossStreetName { get; set;}
}

我的实现允许我插入,更新和删除记录,而BindingSource()的神奇之处似乎在于保持我的数据关系在幕后同步。我遇到的一个难点是,当用户单击详细信息视图中的记录,将其保留为选中状态,然后单击主视图中不是父记录的记录时。此时,程序抛出System.IndexOutOfRangeException,因为它似乎正在尝试将子记录的当前索引应用于新父级。

我认为在RowValidating这样的事件中我可以做些什么来捕捉这个,但我不确定是什么。目前,我正在对新行和数据验证进行基本检查,如下所示:

 private void dataGridSegmentConfig_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {


            if (dataGridViewSegmentConfig.Rows[e.RowIndex].IsNewRow)
            {
                return;
            }

//data validation logic here.
}

1 个答案:

答案 0 :(得分:0)

datagridview正在尝试根据选定的父行设置子行的索引。如果父级中的记录少于子行的选定索引,则抛出IndexOutOfRangeException。为了解决这个问题,我确保如果父行更改,则将子单元格设置为null。

  private void dataGridRouteConfig_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
        {
            //fix for clicking the detail and then clicking a different parent.
            dataGridViewSegmentConfig.CurrentCell = null;

        }