写如下代码,private void button2_Click(object sender, EventArgs e)
{
  string cxCommand = "select * from cxsj order by cxid";
  OleDbDataAdapter cxDataAdapter = new OleDbDataAdapter(cxCommand, myConnection);                
  cxDataAdapter.Fill(dqDataSet,"cx");
  dataGridView1dataGridView1.DataBindingComplete();
  dataGridView1.Columns.Clear();
  dataGridView1.DataSource = dqDataSet.Tables["cx"];                
  dataGridView1.Columns[0].HeaderText="型号";
  dataGridView1.Columns[0].Width=this.dataGridView1.Width-80;                
  dataGridView1[0, 0].Selected = true;                

  
问题1:第一次按button2时显示正常,第二次按错误,提示 dataGridView1.Columns[0].引发了system.argumentoutofrangeexception类型异常
问题2:这样写使用datagridview对吗?感觉没有把datagridview与数据表绑在一起,选择不同行数据表的指针未动。请指点,能不能给个例子?

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Login;public partial class ShowStudentInfo : System.Web.UI.Page
    {
        DropDownList ddlGradeId;
        /// <summary>
        /// 加载事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {       
        }
        /// <summary>
        /// 取消编辑事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvStudents_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            gvStudents.EditIndex = -1;
        }
        /// <summary>
        /// 删除事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvStudents_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            Label lblId = gvStudents.Rows[e.RowIndex].FindControl("lblId") as Label;
            int stuId = Convert.ToInt32(lblId.Text);
           int rowCount =  StudentLogin.DeleteStuById(stuId);
           if (rowCount > 0)
           {
               ClientScript.RegisterStartupScript(this.GetType(), "", "alert('删除成功')", true);
           }
           else {
               ClientScript.RegisterStartupScript(this.GetType(), "", "alert('删除失败')", true);
               return;
           }
            
        }
        /// <summary>
        /// 行编辑事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvStudents_RowEditing(object sender, GridViewEditEventArgs e)
        {
            gvStudents.EditIndex = e.NewEditIndex;
        }
        /// <summary>
        /// 行修改事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvStudents_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            int stuId = Convert.ToInt32((gvStudents.Rows[gvStudents.EditIndex].FindControl("lblstuId") as Label).Text);
            string txtStuName = (gvStudents.Rows[gvStudents.EditIndex].FindControl("txtStuName") as TextBox).Text;
            int ddlGradeId = Convert.ToInt32((gvStudents.Rows[gvStudents.EditIndex].FindControl("ddlGradeId") as DropDownList).Text);
            if (ddlGradeId == -1) {
                ClientScript.RegisterStartupScript(this.GetType(), "", "alert('请选择年级编号')", true);
                return;
            }
            
            RadioButton rbBoy = gvStudents.Rows[gvStudents.EditIndex].FindControl("rbBoy") as RadioButton;
            RadioButton rbGirl = gvStudents.Rows[gvStudents.EditIndex].FindControl("rbGril") as RadioButton;
            int sex = 0;
            if (rbBoy.Checked) {
                sex = 1;
            }
            if (rbGirl.Checked) {
                sex = 0;
            }
            int stuAge =  Convert.ToInt32((gvStudents.Rows[gvStudents.EditIndex].FindControl("txtStuAge") as TextBox).Text);
            string txtStuPhone = (gvStudents.Rows[gvStudents.EditIndex].FindControl("txtStuPhone") as TextBox).Text;
            string txtStuEmail = (gvStudents.Rows[gvStudents.EditIndex].FindControl("txtStuEmail") as TextBox).Text;
            string txtStuAddress = (gvStudents.Rows[gvStudents.EditIndex].FindControl("txtStuAddress") as TextBox).Text;
            int rowCount = StudentLogin.MotiyStuById(txtStuName, sex, stuAge, ddlGradeId, txtStuPhone, txtStuEmail, txtStuAddress, stuId);
            if (rowCount > 0)
            {
                ClientScript.RegisterStartupScript(this.GetType(), "", "alert('修改成功')", true);
            }
            gvStudents.EditIndex = -1;
        }
        /// <summary>
        /// 分页所用事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvStudents_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvStudents.PageIndex = e.NewPageIndex;
        }
        /// <summary>
        /// 预备发送事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_PreRender(object sender, EventArgs e)
        {
            gvStudents.DataSource = StudentLogin.GetAllStudent();
            gvStudents.DataBind();
            //添加一个选择项
            List<Entry.Grade> grades =  StudentLogin.GetAllGrade();
            Entry.Grade grade = new Entry.Grade();
            grade.GradeId = -1;
            grade.GradeName = "请选择";   //向年级表添加一个请选择的项,它的位置是-1,值是请选择
            grades.Insert(0, grade);           //调用一个
            //获取下拉列表里面的值
            if (gvStudents.EditIndex != -1)
            {
                ddlGradeId = gvStudents.Rows[gvStudents.EditIndex].FindControl("ddlGradeId") as DropDownList;
                ddlGradeId.DataSource = grades;
                ddlGradeId.DataTextField = "gradeName";
                ddlGradeId.DataValueField = "gradeId";
                ddlGradeId.DataBind();
            }
                //增加项里面的下拉列表
                DropDownList StuGradeId = ddlAddGradeId as DropDownList;  //因为此下拉列表没有在gridview里面所有就直接拿
                StuGradeId.DataSource = grades;
                StuGradeId.DataTextField = "gradeName";
                StuGradeId.DataValueField = "gradeId";
                StuGradeId.DataBind(); //最后绑定下拉列表
         
        }
        /// <summary>
        /// 判读是否是男
        /// </summary>
        /// <param name="stuSex"></param>
        /// <returns></returns>
        public static bool isBoy(string stuSex)
        {
            if (stuSex == "男")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 判读是否是女
        /// </summary>
        /// <param name="stuSex"></param>
        /// <returns></returns>
        public static bool isGril(string stuSex)
        {
            if (stuSex == "男")
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        protected void btnAdd_Click(object sender, EventArgs e)
        {
            string stu_Name = (txtStuName as TextBox).Text;
            string stu_Age = (txtStuAge as TextBox).Text;
            int stuAge = Convert.ToInt32(stu_Age);
            RadioButton rbBoys = rbBoy as RadioButton;
            RadioButton rbGirls = rbGirl as RadioButton;
            int stu_Sex = 0;
            if (rbBoys.Checked) {
                stu_Sex = 1;
            }
            if (rbGirls.Checked) {
                stu_Sex = 0;
            }        string stu_Address = (txtStuAddress as TextBox).Text;
            string stu_Email = (txtStuEmail as TextBox).Text;
            string stu_Phone = (txtStuPhone as TextBox).Text;
            DropDownList StuGradeId = ddlAddGradeId as DropDownList;  //因为此下拉列表没有在gridview里面所有就直接拿
            int stu_GradeId=-1;
            if (StuGradeId.SelectedItem.ToString() == "S1") {
                stu_GradeId = 1;
            }
            else if (StuGradeId.SelectedItem.ToString() == "S2") {
                stu_GradeId = 2;
            }
            else if (StuGradeId.SelectedItem.ToString() == "Y2")
            {
                stu_GradeId = 3;
            }
            else {
                ClientScript.RegisterStartupScript(this.GetType(), "", "alert('请选择年级!')", true);
                return;
            }
            int rowCount = StudentLogin.AddStu(stu_Name, stu_Sex, stuAge, stu_GradeId, stu_Phone, stu_Email, stu_Address);
            if (rowCount > 0) {
                ClientScript.RegisterStartupScript(this.GetType(), "", "alert('增加成功!')", true);
            }
        }
    }
      

  2.   

    dataGridView1.Columns[0].HeaderText="型号"; 应该是在绑定显示代码之后吧。  应该你在之前已经有绑定了,第二次 dataGridView1.Columns.Clear(); 清空掉了不存在[0]的索引吧。
      

  3.   

    Avoid说先把datagridview里的内容清除。我认为我已经清了dataGridView1.Columns.Clear();
    yes16ws 说的不明白,能否写出来?
    LMAOhuaNL 我没问清楚,不是用在WEB中。
      

  4.   

    你不能只清除Columns,应该清楚整个dataGridView1
      

  5.   

    能写个代码吗?怎么清楚整个dataGridView1
      

  6.   

    把Datathis.dataGridView1.DataSource = null;this.dataGridView1.Rows.Clear();都用了,提示错误到是没了,但在第二次执行时数据重复显示
      

  7.   

    Columns也Clear()一下,可能是重复列造成的
      

  8.   

    还是不对,大家可能没注意,我把dataset定义在外面了,因为这个dataset有多个表,分别用在不同的地方了。如果我把dataset定义在里面那就没问题了。可我不明白为什么,如何解决,请各们指点,我觉得应该很简单,可我就是不知道怎么做。
      

  9.   

    把清除交张委托自动完成,当数据源改变时自动触发此事件
    dataGridView1.DataBindingComplete += delegate {dataGridView1.Columns.Clear();};
    dataGridView1.DataSource = dqDataSet.Tables["cx"];           
      

  10.   

    按dongxinxi说的改成了这样private void button2_Click(object sender, EventArgs e)
    {
      dataGridView1.DataSource=null;
      dataGridView1.Rows.Clear();
      dataGridView1.Columns.Clear();
      string cxCommand = "select * from cxsj order by cxid";
      OleDbDataAdapter cxDataAdapter = new OleDbDataAdapter(cxCommand, myConnection);                
      cxDataAdapter.Fill(cxDataSet,"cx");                
      dataGridView1.DataBindingComplete += delegate { this.dataGridView1.Columns.Clear(); };
      dataGridView1.DataSource = cxDataSet.Tables["cx"];
      dataGridView1.Columns[0].HeaderText = "型号";
      dataGridView1.Columns[0].Width=this.dataGridView1.Width-80;
      dataGridView1[0, 0].Selected = true;                
    } 问题依然存在
      

  11.   

    问题1、dataGridView1.Columns.Clear();此方法在你 dataGridView1里面的数据是绑定的情况下是不可用的;会出现异常这就是你问题的症结
      

  12.   

    忘了问了,Winform中应该不会有问题的
    LZ莫非你是在Web中?很可能是PostBack问题
      

  13.   

    dataGridView1dataGridView1.DataBindingComplete();
    ----------------------------
    在设计器里检查下,你的datagridView是否已经绑定了事件处理程序,如果是的
    那么就不要再次注册了
    dataGridView1.DataBindingComplete += delegate { this.dataGridView1.Columns.Clear(); };
    把清除放到那个处理方法里头去,//dataGridView1.Columns.Clear();   >>>>>>>>>>这一句你怎么还在这儿放着?注释掉
    dataGridView1.DataSource = dqDataSet.Tables["cx"]; 
    上面句执行过了,此时就会跑到DataBindingComplete事件处理方法里头去了
    dataGridView1.Columns[0].HeaderText="型号"; 这一句后面的肯定会报错了(因为在此之前里面所有的列都被清空了)
    dataGridView1.Columns.Add(new DataGridViewColumn(){ HeaderText = dqDataSet.Tables["cx"].Rows[0][0] as string};
    后面的类似 循环来弄吧
      

  14.   

    在方法体的最前面清空数据集数据源
    dataGridView1.DataSource = null;
    dqDataSet.clear();避免数据重复