【问题标题】:Open form with old combobox values使用旧组合框值打开表单
【发布时间】:2015-08-12 05:26:30
【问题描述】:

我正在 C# 上构建一个将数据存储在 SQL 服务器数据库中的表单。 我添加了一个打开按钮,让您可以从表单 PK 中打开一个旧的保存表单。

当我点击打开时,使用showdialog 打开一个新表单,使用数据阅读器读取数据库中的数据。

我在 datetimepicker 工具的 Text Boxes 中获得了正确的值。

但是,当我尝试在打开的表单的 ComboBox 中显示值时,我总是得到第一个默认值,但如果我尝试在旧表单中显示它,则值会发生变化。

dtr.GetString(1) 显示了我想要使用的正确值。

Form1 Editing_Form = new Form1();
        int Result_ID_Number_int = Convert.ToInt32(Result_ID_Number);

    //Retrieve the data from sql server database and load them into the new form 
        try
        {
            sc.Open();         

            //READ PART1 FROM DATABASE
            string Get_Data_Query_1 = (" SELECT statement ");
            cmd = new SqlCommand(Get_Data_Query_1, sc);
            dtr = cmd.ExecuteReader();

            if (dtr.Read())
            {
                Editing_Form.Text_Subject.Text = dtr.GetString(0);
                Editing_Form.ComboBox_Organizer.Text = dtr.GetString(1);
        }

            dtr.Close();
 sc.Close();

        }

        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

编辑

我尝试使用索引,但我仍然得到第一个值(我认为是索引 -1)

 string index_test = dtr.GetString(1);
Editing_Form.ComboBox_Organizer.SelectedIndex = Editing_Form.ComboBox_Organizer.FindStringExact(index_test);

PS:这适用于主表单,而不适用于新打开的表单,其他所有内容(文本框、数据网格视图、复选框)都可以正常工作并获取值

【问题讨论】:

  • 您不仅应该设置文本部分或组合框,还应该通过设置 SelectedIndex 或 SelectedItem 来选择正确的项目!事实上,当你这样做时,你可以将文本部分留给系统..
  • @TaW 我通过将字符串结果值与组合框中的所有可用列表进行比较来获取索引,当我在消息框中显示它时,我得到了正确的索引值。但是当我尝试在组合框中显示它时,我总是得到第一个值,这就是为什么我试图将它作为文本然后设置它
  • 您什么时候在新打开的表单中执行此操作?也许你做得太早了? (将代码复制到按钮是一个很好的测试..)
  • @TaW 是的,我正在从我的主表单打开一个表单,它将从 sql 数据库加载旧数据(就像显示旧表单值的一种方式)。如果我在将打开新表单的按钮的主表单上使用我在编辑中添加的代码,它工作正常,但是当我更改它以修复新打开的表单中的值时,我总是得到默认值。如果我做得太早,文本框的值不应该保持不变吗?

标签: c# forms winforms combobox


【解决方案1】:

首先:
您是否为您的组合框提供了一组可供用户选择的值?如果你忘了这样做,那么你当然会得到 index -1。

如果您为组合框提供了设置的值,那么在查询 SelectedIndex 时您可能仍会得到 -1。原因是:您设置了 text 属性。只有当文本与提供的文本之一完全匹配时,索引 >= 0 才会变为活动状态。 MSDN 上没有描述,但我很确定这包括大写/小写匹配。

此外,您可以通过添加(自定义)对象而不是实际字符串来创建组合框的预设列表。在这种情况下,字符串表示形式(.ToString() 的输出)显示在组合框中,但我怀疑是否可以将其与 Text 属性中的给定字符串进行比较。

另一种可能性:您的数据库文本包含不可打印的字符,未显示。使用字符串的 Length 属性检查无效数据。也许您还有前导或尾随空格,需要通过 Trim() 删除。

但是,为了进行调试,您可以从组合框中选择一个条目并使用 selectedIndexChanged 事件在消息框中显示信息(实际文本、所选索引等)。通过这种方式,您可能会发现数据中的故障。

这就是我对您的问题的所有想法。

编辑
在 cmets 中交换了足够的信息后,您发现了失败:
您的问题是您只创建了表单。 Form_load() 尚未执行,因为在显示表单时会发生这种情况。因此,当您设置组合框的名称属性时,您的组合框不包含任何数据。
当您在主窗体中或作为主窗体进行测试时,组合框很可能在设置值时已经填充。
因此,我回答的第一段实际上是正确的,你和我只需要找出如何以及为什么......

【讨论】:

  • 我尝试了你的建议,我认为问题是当我从数据库中获取值并将其与组合框中的值进行比较时,这些值与 Editing_Form.ComboBox_Organizer 不匹配。 SelectedIndex = Editing_Form.ComboBox_Organizer.FindStringExact(dtr.GetString(1));有没有办法将两个值转换为相同的类型?
  • 你是如何填充组合框的?使用字符串还是使用对象?
  • 尝试将Editing_Form.ComboBox_Organizer.SelectedIndex 设置为任何值 >= 0 以测试组合框是否允许您更改其索引...
  • 我使用数据阅读器 sc.Open(); cmd = new SqlCommand("select Full_Name from dbo.MoM_Emp ORDER BY Full_Name ASC", sc); SqlDataReader R_1,R_2; //ComboBox1 -- 管理器 R_1 = cmd.ExecuteReader();数据表 dt_1 = 新数据表(); dt_1.Columns.Add("Full_Name", typeof(string)); dt_1.加载(R_1); ComboBox_Organizer.ValueMember = "Full_Name"; ComboBox_Organizer.DataSource = dt_1; ComboBox_Organizer.Invalidate(); sc.close()
  • 如果我将 Editing_Form.ComboBox_Organizer.SelectedIndex 用于任何值 >= 0,我会得到一个错误(!INVALID ARGUMENT),如果我输入 -1,我会得到默认的第一个值
【解决方案2】:

您可以在下面尝试:- 添加表单焦点或活动

1) Application.OpenForms[form.Name].Focus();

2) Application.OpenForms[form.Name].Activate();

3) 这可以在打开子页面时添加,如下所示;-

var form = new Form1();

if (Application.OpenForms[form.Name] == null) 

{
       form.Show();
} 
else 
{
    Application.OpenForms[form.Name].Activate();
}

谢谢 日腾德拉

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2016-04-20
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多