【发布时间】:2017-08-20 10:25:53
【问题描述】:
我有一个奇怪的问题,我已经尝试解决了一周但没有成功。
我有一个在表单加载期间填充的组合框,当我单击按钮时它会自行清除,即使没有代码来执行此操作。
使用以下代码填充数据库查询的结果:
private void FrmChart_Load(object sender, EventArgs e)
{
listOfFunds = DatabaseLogic.GetListOfFunds();
cboFundToDisplay.DisplayMember = "FundName";
cboFundToDisplay.ValueMember = "FundName";
cboFundToDisplay.DataSource = listOfFunds;
}
GetListOfFunds 代码
public static DataTable GetListOfFunds()
{
if (db == null)
{
db = new SqliteDatabase();
}
return db.ExecuteQuery(@"SELECT DISTINCT FundName FROM [DATA]");
}
此代码可以正常工作,并且在加载表单时,组合框会被填充。
还有一个按钮,当单击该按钮时,它会从组合框中获取当前选定的值并获取该“基金”的数据。获得数据后,它会设置图表并显示数据。
这也按预期工作,单击按钮时会显示图表。这是使用以下代码完成的:
private void btnGetChartData_Click(object sender, EventArgs e)
{
string fundName = cboFundToDisplay.Text;
DataTable dt = DatabaseLogic.GetDataForFund(fundName);
if (crtMain.Series.Count > 0)
{
crtMain.Series.Clear();
}
crtMain.ChartAreas[0].AxisY.Minimum = ChartLogic.GetMinimumValueWithBuffer("FundUnitPrice", dt, 1);
crtMain.ChartAreas[0].AxisY.Maximum = ChartLogic.GetMaximumValueWithBuffer("FundUnitPrice", dt, 1);
crtMain.ChartAreas[0].AxisX.Minimum = ChartLogic.GetMinimumValue("WeekNumber", dt);
crtMain.ChartAreas[0].AxisX.Maximum = ChartLogic.GetMaximumValue("WeekNumber", dt);
crtMain.Series.Add(fundName);
crtMain.Series[0].ChartType = SeriesChartType.Line;
crtMain.Series[fundName].XValueMember = "WeekNumber";
crtMain.Series[fundName].YValueMembers = "FundUnitPrice";
crtMain.DataSource = dt;
}
我面临的问题是,当我单击按钮更新图表时,组合框的值全部清除,这是出乎意料的。
组合框的清除发生在以下方法中的某处:
DataTable dt = DatabaseLogic.GetDataForFund(fundName);
奇怪的是,如果我将这个方法中的代码(下面列出)移动到 btnGetChartData_Click 的主体中,那么它可以工作并且组合框不会被清除。
public static DataTable GetDataForFund(string fundName)
{
if (db == null)
{
db = new SqliteDatabase();
}
List<string> parameters = new List<string>();
parameters.Add(fundName);
return db.ExecuteQuery(@"SELECT ID, FundName, FundUnitPrice, WeekNumber FROM [DATA] WHERE [FUNDNAME] = @param1", parameters);
}
任何建议将不胜感激。
谢谢
【问题讨论】:
-
能否也添加 GetListOfFunds() 的代码?
-
我的猜测是两个函数都在使用 'db' 变量,并且尝试重用相同的 db 变量正在清除组合框。当您复制代码时,您正在制作一个新的/不同的数据库变量来使用。
-
为 cboFundToDisplay.Items 设置一个监视,并查看实际清除项目的步骤。
-
感谢您的回复。我编辑了帖子以添加 GetListOfFunds 代码。所有的 DB 代码都会检查 db 对象是否存在(不为空),如果不存在则创建一个实例。初始化后,连接仅关闭,因此 DB 对象应始终存在。我在 cboFundToDisplay 上设置了一个手表,但是手表在另一个类中会超出范围,然后当它从方法返回到表单时,它的计数为 0。
标签: c# winforms combobox datasource