2011-05-13 6 views
3

DataGridView에 매우 이상한 문제가 있습니다. 내 사용자 정의 컨트롤에서 3 그리드 있습니다. 이 구현을 사용하고 있습니다 : 나는 디자이너를 사용하여 바인딩 소스와 DataGridview를 연결했습니다. 내 컨트롤 호출의 사용자가 일부 매개 변수를 사용하여 메서드를 초기화합니다. 컨트롤은 3 개의 내부 목록 (실제로는 2 개의 목록 및 개체 사전)을 채 웁니다. 목록이 채워진 후 목록을 바인딩 소스에 할당합니다.dataGridView 및 BindingSource를 사용하는 이상한 문제가 발생했습니다.

두 개의 격자가 제대로 작동하지만 그 중 하나는 아무 것도 표시하지 않습니다 (기본 목록에는 데이터가 포함되어 있음). 나는이 라인을 변경하는 경우 :

bindingSource.DataSource = myList; 

bindingSource.DataSource = myList; 
datagridView.DataSource = null; 
datagridView.DataSource = bindingSource; 

에를 그리드 그러나 그리드의 모든 이벤트는 값이없는 예외 (IndexOutOfRangeException "인덱스 -1 올릴 것이다, 행을 표시합니다. "이 코드 줄에서). 당신의 도움에 대한

public partial class DisplayTradeSplitValuesControl : UserControl 
    { 
     List<TradeSplittingRatio> templateDatasource_ = new List<TradeSplittingRatio>(); 
     List<TradeSplittingRatio> fundsDatasource_ = new List<TradeSplittingRatio>(); 
     Dictionary<string,List<TradeSplittingRatio>> portfolioDatasource_ = 
      new Dictionary<string,List<TradeSplittingRatio>>(); 

     private string instrumentName_ = string.Empty; 

     private RoundingRuleAbstract roundingRule_; 

     public DisplayTradeSplitValuesControl() 
     { 
      InitializeComponent(); 
     } 

     public void Initialize(string portfolioName, string instrumentName, double value) 
     { 
      ConfigManager.GetConfigManager().LoadPortfolioCache(); 
      ConfigManager.GetConfigManager().LoadPortfolioRatioCache();    
      instrumentName_ = instrumentName; 
      roundingRule_ = GetGranularity(instrumentName_); 
      PopulateTemplateDatasource(portfolioName, value); 
      PopulateFundDatasource(portfolioName, value); 
      PopulatePortfolioAndManagedAccountDatasource(); 
      PopulateGrid(); 
     } 

     private void PopulateGrid() 
     { 
      templateSplittingRatioBindingSource.DataSource = templateDatasource_; 
      fundTradeSplittingRatioBindingSource.DataSource = fundsDatasource_; 
      templateDataGridView.Refresh(); 
      //fundsDataGridView.DataSource = null; //not working hack!!! 
      //fundsDataGridView.DataSource = fundTradeSplittingRatioBindingSource.DataSource; 
      fundsDataGridView.Refresh(); 
      if (fundsDatasource_.Count > 0) 
      { 
       string portfolioName = fundsDatasource_[0].ToPortfolio; 
       portfolioTradeSplittingRatioBindingSource.DataSource = portfolioDatasource_[portfolioName]; 

       portfolioDataGridView.Refresh(); 
      } 

     } 

     private void PopulateTemplateDatasource(string portfolioName, double value) 
     { 
      templateDatasource_.Clear(); 
      TradeSplittingRatio template = new TradeSplittingRatio(string.Empty, portfolioName, 0, value, 0); 
      templateDatasource_.Add(template); 
     } 

     private void PopulateFundDatasource(string portfolioName, double value) 
     { 
      fundsDatasource_.Clear(); 
      if (ConfigManager.GetConfigManager().ActivePortfolioCache.ContainsKey(portfolioName) == true) 
      { 
       Portfolio portfolio = ConfigManager.GetConfigManager().ActivePortfolioCache[portfolioName]; 
       if (ConfigManager.GetConfigManager().ActivePortfolioRatioCache.ContainsKey(portfolio) == true) 
       { 
        List<KeyValuePair<Portfolio, double>> portfolioRatio = 
         ConfigManager.GetConfigManager().ActivePortfolioRatioCache[portfolio]; 

        foreach (KeyValuePair<Portfolio, double> ratio in portfolioRatio) 
        { 
         fundsDatasource_.Add(new TradeSplittingRatio(portfolioName, 
                   ratio.Key.Identifier, 
                   ratio.Value, 
                   roundingRule_.Calculate(new Ratio(ratio.Value).Calculate(value)), 
                   roundingRule_.Granularity)); 
        } 
       } 
      } 
     } 

     private void PopulatePortfolioAndManagedAccountDatasource() 
     { 
      portfolioDatasource_.Clear(); 

      List<TradeSplittingRatio> cloneFundsDatasource = new List<TradeSplittingRatio>(); 
      foreach (TradeSplittingRatio fund in fundsDatasource_) 
      { 
       cloneFundsDatasource.Add((TradeSplittingRatio)fund.Clone()); 
      } 

      foreach (TradeSplittingRatio fund in cloneFundsDatasource) 
      { 
       if (portfolioDatasource_.ContainsKey(fund.ToPortfolio) == false) 
        portfolioDatasource_.Add(fund.ToPortfolio,new List<TradeSplittingRatio>()); 

       Portfolio portfolio = ConfigManager.GetConfigManager().ActivePortfolioCache[fund.ToPortfolio]; 
       List<KeyValuePair<Portfolio, double>> portfolioRatio = 
        ConfigManager.GetConfigManager().ActivePortfolioRatioCache[portfolio]; 

       foreach (KeyValuePair<Portfolio, double> ratio in portfolioRatio) 
       { 
        portfolioDatasource_[fund.ToPortfolio].Add(new TradeSplittingRatio 
         (fund.ToPortfolio, 
         ratio.Key.Identifier, 
         ratio.Value, 
         roundingRule_.Calculate(new Ratio(ratio.Value).Calculate(fund.Amount)), 
         roundingRule_.Granularity)); 
       } 
      } 
     } 

     private RoundingRuleAbstract GetGranularity(string instrumentName) 
     { 
      ConfigManager.GetConfigManager().LoadBondCache(); 
      ConfigManager.GetConfigManager().LoadInstrumentCache(); 

      if (ConfigManager.GetConfigManager().ActiveInstrumentCache.ContainsKey(instrumentName)) 
      { 
       if (string.Equals(ConfigManager.GetConfigManager().ActiveInstrumentCache[instrumentName].InstrumentType.Identifier,"CASH") || 
        string.Equals(ConfigManager.GetConfigManager().ActiveInstrumentCache[instrumentName].InstrumentType.Identifier, "FX")) 
       { 
        return new RoundingRule.RoundHalfUpRule(ConfigManager.GetConfigManager().ActiveInstrumentCache[instrumentName].Currency.Granularity); 
       } 
       if (ConfigManager.GetConfigManager().ActiveBondCache.ToList(). 
         Where(c => c.Value.InstrumentId == ConfigManager.GetConfigManager().ActiveInstrumentCache[instrumentName].InstrumentId).Count() > 0) 
       { 
        return new RoundingRule.RoundHalfUpRule(
         ConfigManager.GetConfigManager().ActiveBondCache.ToList(). 
         Where(c => c.Value.InstrumentId == ConfigManager.GetConfigManager().ActiveInstrumentCache[instrumentName].InstrumentId).First().Value.Granularity); 
       } 
      } 
      return new RoundingRule.RoundHalfUpRule(1.0); 
     } 

     private void fundsDataGridView_SelectionChanged(object sender, EventArgs e) 
     { 
      if (fundsDataGridView.Focused) 
      { 
       TradeSplittingRatio fund = (TradeSplittingRatio)fundsDataGridView.SelectedRows[0].DataBoundItem; 
       portfolioTradeSplittingRatioBindingSource.DataSource = portfolioDatasource_[fund.ToPortfolio]; 
       portfolioDataGridView.Refresh();     
      } 
      //Validate(); 
     } 
    //other stuff not important 
    } 
} 

감사 :

이 관련 코드입니다.

답변

1

나는 모든 코드를하지 않았다, 나는 끝에 건너 뛰고이 부분은 나를 뛰어 : 당신이 어떤 항목이 포함되어 있는지 확인하지 않은 경우에도

 private void fundsDataGridView_SelectionChanged(object sender, EventArgs e) 
     { 
      if (fundsDataGridView.Focused) 
      { 
       TradeSplittingRatio fund = (TradeSplittingRatio)fundsDataGridView.SelectedRows[0].DataBoundItem; 
       portfolioTradeSplittingRatioBindingSource.DataSource = portfolioDatasource_[fund.ToPortfolio]; 
       portfolioDataGridView.Refresh();     
      } 
      //Validate(); 
     } 

당신은 DataGridView.SelectedRows[0]에 액세스 . 선택 영역이 비게되면 SelectionChanged가 완전히 실행될 수 있습니다 (일반적으로 데이터 소스가 변경되었거나 지워졌 기 때문에).

여기에서 경계를 테스트하지 않으면 다른 곳에서 경계를 테스트하지 않을 가능성이 있습니다. 당신이 가지고있는 오류 메시지는 정확히 다음과 같이 말하고 있습니다 : 이벤트, 아마도 -1이 인덱스 -1로 생성되었고 행 # -1에 액세스하려고 시도하고 있습니다. 물론 존재하지 않습니다.

업데이트 내가 인용 한 코드와 또 다른 잠재적 인 문제는 집중 검사입니다. 왜 여기에 초점이 맞는지 모르겠지만 DGV는 현재 사용자가 편집중인 셀에서 (단일) 자식 컨트롤을 사용합니다. "편집 컨트롤"에 포커스가있는 경우 DGV.Focused는 false입니다.

+0

감사합니다. 좋은 지적이 있습니다 (경비원을 배치 할 것입니다). 그러나 그것은 내 문제의 원인이 아닙니다. 메서드 내에서 중단 점을 넣었고 중단 점에 도달하지 않았습니다. –

+0

@Alessandro : 나는 내가 지적한 것이 당신의 문제에 접하는 것이 분명하다고 생각했습니다. 나는 "무언가, 아마 사건 ..."을 진술하기 위하여 계속한다. 즉, 내가 지적한 곳이 문제가 아니다. 나는 당신이 가정을 점검하지 못하는 코드를 가지고 있다고 지적했다. 어딘가에는 가정을 확인하지 못하는 코드가 더 있습니다. – Tergiver

관련 문제