C# C-单击按钮时清除WinForm组合框

C# C-单击按钮时清除WinForm组合框,c#,winforms,combobox,datasource,C#,Winforms,Combobox,Datasource,我有一个奇怪的问题,一周来我一直在努力解决,但运气不好 我有一个组合框,它是在表单加载期间填充的,当我单击一个按钮时,它会自动清除,即使没有代码可以这样做 将使用以下代码用数据库查询的结果填充: private void FrmChart_Load(object sender, EventArgs e) { listOfFunds = DatabaseLogic.GetListOfFunds(); cboFundToDisplay.DisplayMember = "FundNam

我有一个奇怪的问题,一周来我一直在努力解决,但运气不好

我有一个组合框,它是在表单加载期间填充的,当我单击一个按钮时,它会自动清除,即使没有代码可以这样做

将使用以下代码用数据库查询的结果填充:

private void FrmChart_Load(object sender, EventArgs e)
{
    listOfFunds = DatabaseLogic.GetListOfFunds();
    cboFundToDisplay.DisplayMember = "FundName";
    cboFundToDisplay.ValueMember = "FundName";
    cboFundToDisplay.DataSource = listOfFunds;
}
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;
}
GetListOfFunds代码

public static DataTable GetListOfFunds()
{
    if (db == null)
    {
        db = new SqliteDatabase();
    }

    return db.ExecuteQuery(@"SELECT DISTINCT FundName FROM [DATA]");
}
这段代码工作正常,在加载表单时,将填充组合框

还有一个按钮,单击该按钮时从组合框中获取当前选定的值,并获取该基金的数据。一旦有了数据,它就会建立一个图表并显示数据

这也按预期工作,单击按钮时显示图表。这是使用以下代码完成的:

private void FrmChart_Load(object sender, EventArgs e)
{
    listOfFunds = DatabaseLogic.GetListOfFunds();
    cboFundToDisplay.DisplayMember = "FundName";
    cboFundToDisplay.ValueMember = "FundName";
    cboFundToDisplay.DataSource = listOfFunds;
}
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);
}
如有任何建议,将不胜感激


谢谢

您正在重用数据源正在使用的db变量。未显示的代码中一定存在一些问题,导致它重置数据源,从而清除组合框。

您是否也可以为GetListOfFunds添加代码?我猜两个函数都在使用“db”变量,并且尝试重用同一个db变量正在清除组合框。复制代码时,您正在创建一个新的/不同的db变量以供使用。设置cboFundToDisplay.Items的监视,并查看实际清除项目的步骤。感谢您的回复。我编辑了这篇文章,添加了GetListOfFunds代码。所有DB代码都会检查DB对象是否存在,如果不存在,则创建一个实例。初始化后,连接仅关闭,因此DB对象应始终存在。我在cboFundToDisplay上设置了一个监视,但是在另一个类中,监视将超出范围,然后当它从方法返回到窗体时,其计数为0。这里的问题是db变量被重用,因此当它尝试将数据表重新绑定到组合框时,它不再能够访问所需的信息,因为db对象现在被用来查询不同的数据集。现在都修好了。谢谢你的帮助@David。