Strange issue using dataGridView and BindingSource

I get a very strange problem with a DataGridView. I have 3 grids in my user control. I use this implementation: I linked the datagridview to the source of bindings using the constructor. The user of my control initializes the method with some parameters. The control fills 3 internal lists (in fact 2 lists and a dictionary of objects). After filling out the lists, I assign the lists to the binding sources.

Two grids work fine, but one of them does not display anything (the main list contains data). If I change this line:

bindingSource.DataSource = myList;

to

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

the grid will display the rows, however any event in the grid will throw an exception (IndexOutOfRangeException "Index -1 does not matter".) in this line of code.

This is the corresponding code:

    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
    }
}

.

+3
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, , , .

, , Focused. , , DGV () , . " " , DGV.Focused .

+1

All Articles