关于c#事件的问题:
  小弟正在看一个MIS的系统,对于其中的一个“事件产生”提出问题:
  源代码:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;namespace ManageInfomationSystem
{
    public partial class MaterielsInfo : Form
    {
        private DataSet ds = new DataSet();
        private LinkDataBase link = new LinkDataBase();
        private string sendTableName = "Materiels";
        private string sendStrSQL = "select MaterielID as 序号,MaterielName as 名称,CategorieName as 种类" +
                                     ",UnitInStock as 库存,UnitPrice as [价格(元)],[Materiels].[Description] as 描述 from Materiels,Categories where " +
                                     "[Materiels].CategorieID=[Categories].CategorieID";        public MaterielsInfo()
        { 
            InitializeComponent();
        }        public MaterielsInfo(bool blShowToolBar)
        {
            InitializeComponent();
            ds = link.SelectDataBase(sendStrSQL, sendTableName);
            DataGridStateControl(blShowToolBar);
            dgrd_MaterielsData.DataSource=ds.Tables[0];
            //foreach(DataRelation a in ds.Tables[0].ParentRelations)
            //{
            //    MessageBox.Show( a.ChildColumns.ToString());
            //}
            toolStrip1.Enabled = blShowToolBar;
        }        private void DataGridStateControl(bool blReadOnly)
        {
            DataGridTableStyle ts = new DataGridTableStyle();
            ts.AlternatingBackColor = Color.LightGray;
            ts.MappingName = ds.Tables[0].TableName;
            ts.AllowSorting = false;            int numCols = ds.Tables[0].Columns.Count;
            for (int i = 0; i < numCols; i++)
            {
                if (blReadOnly == true)
                {
                    if (i == 4)
                    {
                        DataTable tempTable = new DataTable();
                        tempTable.Columns.Add();
                        object[] rowValues = new object[] { "个", "盒", "支", "箱", "带" };
                        for (int j = 0; j < 5; j++)
                        {
                            tempTable.Rows.Add(tempTable.NewRow());
                            tempTable.Rows[j][0] = rowValues[j];
                        }                        DataGridComboBoxColumn aComboBoxColumn = new DataGridComboBoxColumn(tempTable, 0, 0);
                        aComboBoxColumn.MappingName = ds.Tables[0].Columns[i].ColumnName;
                        aComboBoxColumn.HeaderText = ds.Tables[0].Columns[i].ColumnName;
                        aComboBoxColumn.NullText = "";
                        ts.GridColumnStyles.Add(aComboBoxColumn);
                    }
                    else
                    {
                        DataGridTextBoxColumn aColumnTextColumn = new DataGridTextBoxColumn();
                        aColumnTextColumn.MappingName = ds.Tables[0].Columns[i].ColumnName;
                        aColumnTextColumn.HeaderText = ds.Tables[0].Columns[i].ColumnName;
                        aColumnTextColumn.NullText = "";
                        aColumnTextColumn.Format = "F";
                        ts.GridColumnStyles.Add(aColumnTextColumn);
                    }
                }
                else
                {
                    DataGridNoActiveCellColumn aColumnTextColumn = new DataGridNoActiveCellColumn();
                    aColumnTextColumn.MappingName = ds.Tables[0].Columns[i].ColumnName;
                    aColumnTextColumn.HeaderText = ds.Tables[0].Columns[i].ColumnName;
                    aColumnTextColumn.NullText = "";
                    aColumnTextColumn.Format = "F";
                    ts.GridColumnStyles.Add(aColumnTextColumn);
                }
            }
            dgrd_MaterielsData.TableStyles.Add(ts);
        }
//*******************************************************
        private void btn_Search_Click(object sender, EventArgs e)
        {
            string tempStrSQL =sendStrSQL+ " and MaterielName like '%" + txt_strSearchWord.Text.Trim() + "%'";
            link.SelectDataBase(tempStrSQL, sendTableName);
        }        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            try
            {
                int row = dgrd_MaterielsData.CurrentCell.RowNumber;
                dgrd_MaterielsData.CurrentCell = new DataGridCell(row + 1, 0);
                if (ds.HasChanges())
                {
                    if (MessageBox.Show("确实要保存修改?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        link.UpdateDataBase(ds.GetChanges(), sendTableName);
                        MessageBox.Show("数据保存成功!", "消息");
                    }
                    return;
                }
                else
                {
                    MessageBox.Show("数据没有做任何修改", "消息");
                    return;
                }
            }
            catch
            {
                MessageBox.Show("数据保存失败,请确认保存数据正确!", "提示");
                return;
            }
        }        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("确实要删除这条记录?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    ds.Tables[0].Rows[dgrd_MaterielsData.CurrentCell.RowNumber].Delete();
                    link.UpdateDataBase(ds.GetChanges(), sendTableName);
                    MessageBox.Show("数据记录删除成功 !","消息");
                }
                catch
                {
                    MessageBox.Show("数据记录不能删除!", "消息");
                    link.SelectDataBase(sendStrSQL, sendTableName);
                    return;
                }
            }
        }
//*************************************
    }       
}link类代码如下:
using System;
using System.Data;
using System.Data.SqlClient;namespace ManageInfomationSystem
{
    public class LinkDataBase
    {
        private string strSQL;
        private SqlConnection myConnection = new SqlConnection(@"Data Source=(local);Initial Catalog=materielsMsys;Integrated Security=SSPI;");
        private SqlCommandBuilder sqlCmdBld;
        private DataSet ds = new DataSet();
        private SqlDataAdapter da;        public LinkDataBase()
        { }        public DataSet SelectDataBase(string tempStrSQL, string tempTableName)
        {
            strSQL = tempStrSQL;
            da = new SqlDataAdapter(strSQL, myConnection);
            da.Fill(ds, tempTableName);
            return ds;
        }        public DataTable SelectDataBase(string tempStrSQL)
        {
            DataSet tempDataSet = new DataSet();
            da = new SqlDataAdapter(tempStrSQL, myConnection);
            da.Fill(tempDataSet);
            return tempDataSet.Tables[0];
        }        public DataSet UpdateDataBase(DataSet changedDataSet, string tempTableName)
        {
            da = new SqlDataAdapter(strSQL, myConnection);
            sqlCmdBld = new SqlCommandBuilder(da);
            da.Update(changedDataSet, tempTableName);
            return changedDataSet;
        }        public int UpdateDataBase(string tempStrSQL)
        {
            myConnection.Open();
            SqlCommand tempCommand = new SqlCommand(tempStrSQL, myConnection);
            int intNumber = tempCommand.ExecuteNonQuery();
            myConnection.Close();
            return intNumber;
        }
    }
}

解决方案 »

  1.   

    too long 
     把你感到有问题的代码,贴出来
      

  2.   

    现在问题是:
    我仅在  btn_Search_Click;private void btn_Search_Click;toolStripButton2_Click三个事件中改变了 “LINK” 对象,但是此前窗口(MaterielsInfo)已经打开,而且DataGrid(dgrd_MaterielsData)控件已经显示数据了。如果激发了上述3个事件后,DataGrid(dgrd_MaterielsData)控件又显示了新的查询数据。而对DataGrid(dgrd_MaterielsData)控件进行数据源设置仅仅是在窗口构造函数的时候,因此当点击上述三个按钮的时候因该DataGrid(dgrd_MaterielsData)不改变才是。为什么DataGrid(dgrd_MaterielsData)控件又显示了新的查询数据?在线等,谢谢大虾。
      

  3.   

    代码太长啦~没看~是不是视图状态~或者用Session吧~~
      

  4.   

    就是private void btn_Search_Click事件啊,我点btn_Search的时候DataGrid(dgrd_MaterielsData)就改变了,可是代码只有改变link对象啊。        private void btn_Search_Click(object sender, EventArgs e) 
            { 
                string tempStrSQL =sendStrSQL+ " and MaterielName like  '%" + txt_strSearchWord.Text.Trim() + "% '"; 
                link.SelectDataBase(tempStrSQL, sendTableName); 
            } DataGrid(dgrd_MaterielsData)只有构造函数的时候才对数据源赋值的,代码:       public MaterielsInfo(bool blShowToolBar) 
            { 
                InitializeComponent(); 
                ds = link.SelectDataBase(sendStrSQL, sendTableName); 
                DataGridStateControl(blShowToolBar); 
                dgrd_MaterielsData.DataSource=ds.Tables[0]; 
                //foreach(DataRelation a in ds.Tables[0].ParentRelations) 
                //{ 
                //    MessageBox.Show( a.ChildColumns.ToString()); 
                //} 
                toolStrip1.Enabled = blShowToolBar; 
            } 
      

  5.   

    因为  dgrd_MaterielsData.DataSource=ds.Tables[0]; 这句
    当ds里面的数据更新时,dgrd_MaterielsData也会自动更新;link.SelectDataBase(tempStrSQL, sendTableName); //语句改变了 ds的值
      

  6.   

    建议这么写:构造链
             public MaterielsInfo() :this(false)
            {  
                //InitializeComponent(); 
            }         public MaterielsInfo(bool blShowToolBar) 
            { 
                InitializeComponent(); 
                ds = link.SelectDataBase(sendStrSQL, sendTableName); 
                DataGridStateControl(blShowToolBar); 
                dgrd_MaterielsData.DataSource=ds.Tables[0]; 
                //foreach(DataRelation a in ds.Tables[0].ParentRelations) 
                //{ 
                //    MessageBox.Show( a.ChildColumns.ToString()); 
                //} 
                toolStrip1.Enabled = blShowToolBar; 
            } 
      

  7.   

    11楼的我知道ds变了,可是一开始构造窗口的时候就把DataGrid填入ds了,后来在变ds。DataGrid还是跟着变?谁给他的权力?
      

  8.   

    11楼的意思是datagrid的数据源是一致在动态刷新了?
      

  9.   

    dgrd_MaterielsData.DataSource=ds.Tables[0]; 
    ---》
    DS改变
    DataGrid的数据源就会跟着变
    引用~~~~