【问题标题】:C# - WinForm ComboBox Clearing On Button ClickC# - WinForm ComboBox 清除按钮单击
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这里的问题是 db 变量正在被重用,因此当它尝试将数据表重新绑定到组合框时,它不再可以访问所需的信息,因为 db 对象现在被用来查询一组不同的数据。现在都修好了。感谢您的帮助@David。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多