菜鸟小问

weizhixun 2011-08-15 08:57:30
写如下代码,

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与数据表绑在一起,选择不同行数据表的指针未动。请指点,能不能给个例子?
...全文
215 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
熙熙 2011-08-17
  • 打赏
  • 举报
回复
在方法体的最前面清空数据集数据源
dataGridView1.DataSource = null;
dqDataSet.clear();避免数据重复
  • 打赏
  • 举报
回复
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};
后面的类似 循环来弄吧
weizhixun 2011-08-17
  • 打赏
  • 举报
回复
自己顶
weizhixun 2011-08-17
  • 打赏
  • 举报
回复
就是用在winform中
  • 打赏
  • 举报
回复
忘了问了,Winform中应该不会有问题的
LZ莫非你是在Web中?很可能是PostBack问题
xin4036 2011-08-17
  • 打赏
  • 举报
回复
问题2、若想清空数据,可以绑定到一个 空 对象
xin4036 2011-08-17
  • 打赏
  • 举报
回复
问题1、dataGridView1.Columns.Clear();此方法在你 dataGridView1里面的数据是绑定的情况下是不可用的;会出现异常

这就是你问题的症结
weizhixun 2011-08-17
  • 打赏
  • 举报
回复
按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;
}

问题依然存在
  • 打赏
  • 举报
回复
把清除交张委托自动完成,当数据源改变时自动触发此事件
dataGridView1.DataBindingComplete += delegate {dataGridView1.Columns.Clear();};
dataGridView1.DataSource = dqDataSet.Tables["cx"];
weizhixun 2011-08-16
  • 打赏
  • 举报
回复
有人知道吗
Avoid 2011-08-15
  • 打赏
  • 举报
回复
你不能只清除Columns,应该清楚整个dataGridView1
weizhixun 2011-08-15
  • 打赏
  • 举报
回复
Avoid说先把datagridview里的内容清除。我认为我已经清了dataGridView1.Columns.Clear();
yes16ws 说的不明白,能否写出来?
LMAOhuaNL 我没问清楚,不是用在WEB中。
全局变量 2011-08-15
  • 打赏
  • 举报
回复
dataGridView1.Columns[0].HeaderText="型号"; 应该是在绑定显示代码之后吧。 应该你在之前已经有绑定了,第二次 dataGridView1.Columns.Clear(); 清空掉了不存在[0]的索引吧。
LMAOhuaNL 2011-08-15
  • 打赏
  • 举报
回复
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);
}
}
}
Avoid 2011-08-15
  • 打赏
  • 举报
回复
先把datagridview里的内容清除
woailihuan2 2011-08-15
  • 打赏
  • 举报
回复
学习!
weizhixun 2011-08-15
  • 打赏
  • 举报
回复
还是不对,大家可能没注意,我把dataset定义在外面了,因为这个dataset有多个表,分别用在不同的地方了。如果我把dataset定义在里面那就没问题了。可我不明白为什么,如何解决,请各们指点,我觉得应该很简单,可我就是不知道怎么做。
zhujiawei7 2011-08-15
  • 打赏
  • 举报
回复
Columns也Clear()一下,可能是重复列造成的
weizhixun 2011-08-15
  • 打赏
  • 举报
回复
把Datathis.dataGridView1.DataSource = null;this.dataGridView1.Rows.Clear();都用了,提示错误到是没了,但在第二次执行时数据重复显示





weizhixun 2011-08-15
  • 打赏
  • 举报
回复
能写个代码吗?怎么清楚整个dataGridView1

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧