C# 使用旧组合框值打开表单

C# 使用旧组合框值打开表单,c#,forms,winforms,combobox,C#,Forms,Winforms,Combobox,我正在C上构建一个表单,将数据存储在SQL server数据库上。 我添加了一个打开按钮,可以让你从表单PK中打开一个旧的保存表单 当我点击open时,使用showdialog打开一个新表单,使用数据读取器读取数据库中的数据 我在文本框中得到了正确的值,datetimepicker工具 然而,当我尝试在打开的表单的组合框中显示值时,我总是会得到第一个默认值,但是如果我尝试在旧表单中显示它,值就会改变 dtr.GetString1显示了我想要使用的正确值 Form1 Editing_Form =

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

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

我在文本框中得到了正确的值,datetimepicker工具

然而,当我尝试在打开的表单的组合框中显示值时,我总是会得到第一个默认值,但是如果我尝试在旧表单中显示它,值就会改变

dtr.GetString1显示了我想要使用的正确值

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:这适用于主窗体,而不适用于新打开的窗体,其他所有文本框、数据网格视图、复选框都可以正常工作并获取值,您可以在下面尝试:-添加窗体焦点或activete

1.Application.OpenForms[form.Name].Focus

2.Application.OpenForms[form.Name]。激活

3如下图所示,打开子页面时可以添加此项;-

var form=新Form1

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

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

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

1.Application.OpenForms[form.Name].Focus

2.Application.OpenForms[form.Name]。激活

3如下图所示,打开子页面时可以添加此项;-

var form=新Form1

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

{
       form.Show();
} 
else 
{
    Application.OpenForms[form.Name].Activate();
}
谢谢 吉坦德拉首先: 您是否向组合框提供了一组值供用户选择?如果您忘记了这样做,那么您当然会始终得到索引-1

如果您向组合框提供了值集,那么如果查询SelectedIndex,您仍然可以得到-1。原因是:您设置了文本属性。索引>=0仅在文本与提供的文本之一完全匹配时才会激活。MSDN中没有对其进行描述,但我确信这包括大小写匹配

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

另一种可能性:数据库文本包含不可打印的字符,这些字符不会显示。使用字符串的Length属性检查无效数据。也许你也有前导或尾随的空格,需要通过修剪去除

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

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

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

首先: 您是否向组合框提供了一组值供用户选择?如果您忘记了这样做,那么您当然会始终得到索引-1

如果您向组合框提供了值集,那么如果查询SelectedIndex,您仍然可以得到-1。原因是:您设置了文本属性。索引>=0仅在文本与提供的文本之一完全匹配时才会激活。MSDN中没有对其进行描述,但我确信这包括大小写匹配

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

另一种可能性:数据库文本包含不可打印的字符,这些字符不会显示。使用字符串的Length属性检查无效数据。也许你也有前导或尾随的空格,需要通过修剪去除

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

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

编辑 在评论中交换了足够的信息后,您发现了故障: 您的问题是您只创建了表单。表单加载尚未执行,因为在显示表单时会发生这种情况。因此,您的组合框不包含任何d ata当您设置组合框的name属性时。 当您在主窗体中或作为主窗体进行测试时,很可能在设置值时已经填充了组合框。
因此,我的答案中的第一段实际上是正确的,您和我只需找出如何以及为什么…

您不仅应该设置文本部分或组合框,还应该通过设置SelectedIndex或SelectedItem来选择正确的项目!事实上,当您这样做时,您可以将文本部分留给系统。@TaW我通过将字符串结果值与组合框中所有可用列表进行比较来获取索引,并且当我在消息框中显示它时,获取正确的索引值。但是当我尝试在组合框中显示它时,我总是得到第一个值,这就是为什么我尝试将它作为文本显示,然后设置它。您什么时候在新打开的表单中执行此操作?也许你做得太早了?将代码复制到按钮是一个很好的测试。@TaW是的,我正在从主窗体打开一个窗体,它将从sql数据库加载旧数据,就像显示旧窗体值的方式一样。如果我在打开新窗体的按钮中使用在主窗体的“编辑”中添加的代码,它可以正常工作,但是当我更改它以修复新打开窗体中的值时,我总是得到默认值。如果我做得太快,文本框的值不应该保持不变吗?您不仅应该设置文本部分或组合框,还应该通过设置SelectedIndex或SelectedItem来选择正确的项目!事实上,当您这样做时,您可以将文本部分留给系统。@TaW我通过将字符串结果值与组合框中所有可用列表进行比较来获取索引,并且当我在消息框中显示它时,获取正确的索引值。但是当我尝试在组合框中显示它时,我总是得到第一个值,这就是为什么我尝试将它作为文本显示,然后设置它。您什么时候在新打开的表单中执行此操作?也许你做得太早了?将代码复制到按钮是一个很好的测试。@TaW是的,我正在从主窗体打开一个窗体,它将从sql数据库加载旧数据,就像显示旧窗体值的方式一样。如果我在打开新窗体的按钮中使用在主窗体的“编辑”中添加的代码,它可以正常工作,但是当我更改它以修复新打开窗体中的值时,我总是得到默认值。如果我做得太快,文本框的值是否也应该保持不变?我尝试了你的建议,我认为问题是当我从数据库中获取值并将其与组合框中的值进行比较时,值与编辑\u Form.ComboBox\u Organizer.SelectedIndex=编辑\u Form.ComboBox\u Organizer.FindStringExactdtr.GetString1不匹配;有没有办法将两个值强制转换为同一类型?如何填充组合框?使用字符串或对象?尝试将编辑\u Form.ComboBox\u Organizer.SelectedIndex设置为任何值>=0,以测试ComboBox是否允许您更改其索引…我使用数据读取器sc填充了它们。Open;cmd=new sqlcommands按全名ASC,sc从dbo.MoM\u Emp顺序选择全名;SqlDataReader R_1,R_2//ComboBox1-组织者R_1=cmd.ExecuteReader;DataTable dt_1=新的DataTable;dt_1.Columns.add全名,typeofstring;dt_1.LoadR_1;ComboBox\u Organizer.ValueMember=全名;ComboBox_Organizer.DataSource=dt_1;组合框_Organizer.Invalidate;sc.close如果我使用“编辑”\u Form.ComboBox\u Organizer.SelectedIndex to any value>=0,我会得到一个错误!无效参数,如果我输入-1我得到默认的第一个值我尝试了你的建议,我认为问题在于当我从数据库中获取值并将其与组合框中的值进行比较时,这些值与编辑\u Form.ComboBox\u Organizer.SelectedIndex=编辑\u Form.ComboBox\u Organizer.FindStringExactdtr.GetString1不匹配;有没有办法将两个值强制转换为同一类型?如何填充组合框?使用字符串或对象?尝试将编辑\u Form.ComboBox\u Organizer.SelectedIndex设置为任何值>=0,以测试ComboBox是否允许您更改其索引…我使用数据读取器sc填充了它们。Open;cmd=new sqlcommands按全名ASC,sc从dbo.MoM\u Emp顺序选择全名;SqlDataReader R_1,R_2//ComboBox1-组织者R_1=cmd.ExecuteReader;DataTable dt_1=新的DataTable;dt_1.Columns.add全名,typeofstring;dt_1.LoadR_1;ComboBox\u Organizer.ValueMember=全名;ComboBox_Organizer.DataSource=dt_1;组合框_Organizer.Invalidate;sc.close如果我使用“编辑”\u Form.ComboBox\u Organizer.SelectedIndex to any value>=0,我会得到一个错误!无效参数,如果我输入-1,我将获得默认的第一个值