【问题标题】:Selecting an item in ComboBox, which is Data bound在 ComboBox 中选择一个项目,该项目是数据绑定的
【发布时间】:2011-05-28 17:38:08
【问题描述】:

在我的主窗体上,有dataGridView1,它绑定到一个数据库表。在我的编辑表单上,有一个ComboBox,它通过数据绑定从与dataGridView1 相同的数据库中获取它的项目。在dataGridView1 单元格双击时,该编辑表单将打开并填充编辑该特定行所需的所有字段。

这是我的问题: 当我尝试在该编辑表单上设置 ComboBox 的值时,没有任何反应。没有给出错误并且没有选择 ComboBox 中的项目。

fDodaj nov = new fDodaj();
nov.comboBox1.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[4].Value.ToString();
if(nov.ShowDialog()==DialogResult.OK)
{
//code that updates the value in database
}

fDodaj 是我的编辑表单。 我尝试在ComboBox 上设置SelectedValueSelectedItemSelectedTextText 属性,无论如何都没有运气。

我做错了什么?

PS:我不太擅长Visual C#,但这是我的学校项目。如果您需要更多信息,请告诉我。

【问题讨论】:

  • 数据何时绑定到 ComboBox?过早设置 ComboBox 文本(即在绑定 CB 之前)很可能是这里的问题。
  • 数据绑定在fDodaj_Load。我尝试将nov.combobox1.text = ...(以及 SelectedValue、SelectedItem 和 SelectedText)放入 if 语句中,但仍然没有运气。
  • 在您设置上面的ComboBox1.Text 时,ComboBox 不会被绑定,因为在准备显示对话框时会发生绑定 - 在ShowDialog 调用中.
  • 哦,所以我需要打开那个表单然后设置值,对吧?我认为表单完全建立在新对象的创建之上,我相信我现在明白了。

标签: c# winforms


【解决方案1】:

将您的 ComboBox 数据绑定移动到表单的构造函数中,而不是像您当前所做的那样将其保留在 Form.Load 中。确保它在构造函数中调用InitializeComponent 之后绑定。

这将允许您在显示对话框之前设置 ComboBox SelectedValue 或类似内容。

【讨论】:

  • 非常感谢,你救了我的命 :)
  • 救了你的命?你现在是我的了! :) 享受您的编码!
【解决方案2】:

数据绑定发生在表单显示之后 因此,当您设置所选值时,组合框的数据源中没有任何内容 在设置选择值之前设置组合框的数据源

【讨论】:

    【解决方案3】:

    我也不擅长 Visual C#。但是你有没有在 fDodaj 的 Form_Load 中尝试过这个。在我看来,此时组合可能尚未初始化。

    【讨论】:

      【解决方案4】:

      首先,将控件公开并不是一个好习惯,因此您可以通过表单(或类)访问它们,就像您在示例中所做的那样: nov.comboBox1.Text 将它们设为私有并将值(数据)传递给它们总是好的。你应该这样做:

      //form1
          public partial class Form1 : Form
          {
              DataTable table;
              public Form1()
              {
                  InitializeComponent();
                  table = new DataTable("myTable");
                  table.Columns.Add("column 1", typeof(string));
      
                  //some example data:
                  table.Rows.Add("a");
                  table.Rows.Add("b");
                  table.Rows.Add("c");
                  dataGridView1.DataSource = table;
      
                  dataGridView1.CellDoubleClick += new DataGridViewCellEventHandler(dataGridView1_CellDoubleClick);
              }
      
              private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
              {
                  string _value = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString();
                  if (_value != String.Empty)
                  {
                      using (Form2 f2 = new Form2(_value))
                      {
                          if (f2.ShowDialog() == DialogResult.OK)
                          { 
      
                          }
                      }
                  }
              }
          }
      
      //form2:
          public partial class Form2 : Form
          {
              public Form2(string value)
              {
                  InitializeComponent();
                  //some example data in the comboBox:
                  comboBox1.Items.AddRange(new string[] { "a", "b", "c" });
      
                  //lets select the item which came from form1:
                  comboBox1.SelectedItem = value;
              }
          }
      

      如果不是这样,请告诉我,将进一步帮助您。 再见,再见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        相关资源
        最近更新 更多