none
如何刷新ComboBox 显示新记录 RRS feed

  • 问题

  • 在FORM1里面有一个ComboBox, 在FORM1开启时通过DataSet从SQL中获取记录并显示在ComboBox中。ComboBox和DataSet是绑定在一起的。现在的问题是当通过 “DataAdaper.Update()" 向数据库添加了新的记录,不能自动地刷新ComboBox显示新的记录,一定要重启FORM1才能显示出来。什么办法能即刻自动的刷新ComboBox显示出新的记录来, 谢谢。
    2013年3月1日 18:17

答案

  • 你或许可以这样考虑:

    你应该设法:

    1)为Form2多定义一个带参数的构造函数(参数是Combobox类),这样以便点击Form1的Button时候可以使用类似new Form2(Combobox1)把Form1的那个下拉列表传入到Form2中控制。

    2)在Form2中,一旦更新了数据源,重新绑定到这个由自定义构造函数传入的Combobox实体,刷新即可。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月3日 12:05
    版主

全部回复

  • 重新设置Combobox数据源即可:

    Combobox1.DataSource = null;
    
    Combobox1.DataSource = 更新后的数据源;
    
    ………………

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月2日 1:21
    版主
  • 我试过了,不行啊。

    我原来的笨想法是重新再执行一次“连接数据库--建立DataSet--为ComboBox赋值”的过程,我觉得应该可以,可是不行。请指教。

    2013年3月2日 5:28
  • 给出你完整的代码,谢谢,我看看。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月2日 5:29
    版主
  • 谢谢你这么耐心,我先做个简要说明,然后是代码。

    一共有两个FORM,分别是FORM1和FORM2。

    FORM1 包括一个ComboBox和一个按钮。 ComboBox在FORM1启动时自动从数据库获得数据加载。 按钮的功能是打开FORM2。

    FORM2包含一个TextBox和一个按钮,按钮的作用是利用Click 事件把TextBox中的内容写进数据库。

    我的问题是TextBox的内容传给数据库后,如何能即时的在FORM1 的ComboBox里显示出来。

    现在的状况是如果把TextBox置于FORM1中就能很好的显示出来, 在另一个Form中就显示不出来。

    一共有四个类, 分别是FORM1,FORM2, LoadingComboBox 和 ConnectDataBase。其中 LoadingComboBox 继承自 ConnectDataBase。

    代码如下:

    *************************************************************

    FORM1

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                fillComboBox();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
            }
            
           internal void  fillComboBox()
            {
                LoadingComboBox thisLoad=new LoadingComboBox(this.comboBoxStdGroup);
            }

            private void buttonOpenForm2_Click(object sender, EventArgs e)
            {
               // LoadingComboBox thisload = new LoadingComboBox(this.textBoxNewStdGroup);
                Form2 form2 = new Form2();
                form2.Show();
             }

    }

    **************************************************************************************

    FORM2

    public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                LoadingComboBox newLoading = new LoadingComboBox(this.textBoxNewStdGroup);
                Form1 form1 = new Form1();
                form1.fillComboBox();
                this.Close();
                
            }
        }

    ******************************************************************************

    LodingComboBox

     class LoadingComboBox : ConnectDataBase
        {
            //构造函数1

    public LoadingComboBox(ComboBox cBox)
            {
                fillComboBox(cBox);

            }

    //构造函数2

            public LoadingComboBox(TextBox tBox)
            {
                upDateDataAdapter(tBox);
            }

    //FORM1启动时调用此方法加载ComboBox
            private void fillComboBox(ComboBox cBox)
            {
                StringClass myString = new StringClass();
                OpenConnection(myString.ConnString);
                SqlDataAdapter thisDA = CreatDataAdapter(myString.GetStdGroup);
                DataSet ds = new DataSet();


                try
                {
                    thisDA.Fill(ds, "myTable");
                    cBox.DataSource = ds.Tables["myTable"];
                    cBox.DisplayMember = "StandardGroupIndex";
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    closeConnection();
                }



            }

    //将TextBox中的内容写进数据库
            private void upDateDataAdapter(TextBox tBox)
            {
                StringClass myString = new StringClass();
                OpenConnection(myString.ConnString);
                SqlDataAdapter thisDA = CreatDataAdapter(myString.GetStdGroup);
                DataSet ds = new DataSet();


                try
                {
                    thisDA.Fill(ds, "myTable");
                    fillNewStdGroup(ds, tBox);
                    thisDA.Update(ds, "myTable");
                }
                catch (SqlException ex)
                {
                    throw ex;
                }
                finally
                {
                    closeConnection();
                }
            }

            private void fillNewStdGroup(DataSet ds, TextBox tBox)
            {
                DataRow thisRow = ds.Tables["myTable"].NewRow();
                thisRow["StandardGroupID"] = ds.Tables["myTable"].Rows.Count + 1001;
                thisRow["StandardGroupIndex"] = tBox.Text.ToString();
                ds.Tables["myTable"].Rows.Add(thisRow);

            }

        }

    ****************************************************************************************

    ConnectDataBase类

    class ConnectDataBase
        {
        private SqlConnection conn;

            //---------
            //Open Connection
         //-------------
            public void OpenConnection(string connectionString)
            {
                conn = new SqlConnection(connectionString);
            }

    //Close connection
            public void closeConnection()
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();

                }
            }

     //create a dataAdapter

            public SqlDataAdapter CreatDataAdapter(string querryString)
            {

                SqlDataAdapter thisAdapter = new SqlDataAdapter();
                thisAdapter.SelectCommand = new SqlCommand(querryString, conn);
                SqlCommandBuilder thisCommandBuild = new SqlCommandBuilder(thisAdapter);
                
                return thisAdapter;
            }

    我估计这对你是一个很容易的事, 但是读一个笨手写的笨拙的代码一定是很耗费时间的事情,再次感谢你的耐心。

    2013年3月2日 20:20
  • 你或许可以这样考虑:

    你应该设法:

    1)为Form2多定义一个带参数的构造函数(参数是Combobox类),这样以便点击Form1的Button时候可以使用类似new Form2(Combobox1)把Form1的那个下拉列表传入到Form2中控制。

    2)在Form2中,一旦更新了数据源,重新绑定到这个由自定义构造函数传入的Combobox实体,刷新即可。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月3日 12:05
    版主
  • 谢谢提示,我再试试。

    现在我想了一个办法,就是采用TabPage, 不再用form1和form2, 这样就可以即时更新了。不过我还是要继续琢磨你的提示,再次感谢。

    2013年3月4日 15:53
  • 谢谢提示,我再试试。

    现在我想了一个办法,就是采用TabPage, 不再用form1和form2, 这样就可以即时更新了。不过我还是要继续琢磨你的提示,再次感谢。

    OK,等你结果。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月5日 3:21
    版主