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
}
}
감사 :
이 관련 코드입니다.
감사합니다. 좋은 지적이 있습니다 (경비원을 배치 할 것입니다). 그러나 그것은 내 문제의 원인이 아닙니다. 메서드 내에서 중단 점을 넣었고 중단 점에 도달하지 않았습니다. –
@Alessandro : 나는 내가 지적한 것이 당신의 문제에 접하는 것이 분명하다고 생각했습니다. 나는 "무언가, 아마 사건 ..."을 진술하기 위하여 계속한다. 즉, 내가 지적한 곳이 문제가 아니다. 나는 당신이 가정을 점검하지 못하는 코드를 가지고 있다고 지적했다. 어딘가에는 가정을 확인하지 못하는 코드가 더 있습니다. – Tergiver