在学习的过程中,总有那些让我们卡在那一小时甚至一天的问题,他打败不了我们,却总是激起我们的斗志.
零晨0:09分,终于搞定一个,庆祝,记录.
示例09\03:使用Command对象修改数据.
问题描述:
GridView控件添加自定义bind()方法,如下(参见ASP.NET从入门到精通9.3.3)
protected void bind()
{
SqlConnection myConn = GetConnection();
myConn.Open();
string sqlStr = "select * from tb_Class ";
SqlDataAdapter myDa = new SqlDataAdapter(sqlStr, myConn);
DataSet myDs = new DataSet();
myDa.Fill(myDs);
GridView1.DataSource = myDs;
GridView1.DataKeyNames = new string[] { "id" };
GridView1.DataBind();
myDa.Dispose();
myDs.Dispose();
myConn.Close();
}
敲好代码后页面中,没有数据内容,只有下图所示,
用一小时没找到原因,最后找到原因
如何解决:
最后重新添加了一个GradView控件,竟然正常,对比知:AutoGenerateColumns被我设置成False了,修改过来,好了.
收获:
此问题无意中的错误,唯一的收获是知道了AutoGenerateColumns这个属性的作用
但有一个附加的收获是在查找问题的时候我运行书中的源代码,竟然报出异常.
我还是坚信这本书的质量,所以问题肯定在我.
异常处在红色字体那一行.应该是ToInt32的参数不是数字.
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int ClassID = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value.ToString());
string CName = ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString();
string sqlStr = "update tb_Class set ClassName='" + CName + "' where ClassID=" + ClassID;
SqlConnection myConn = GetConnection();
myConn.Open();
SqlCommand myCmd = new SqlCommand(sqlStr, myConn);
myCmd.ExecuteNonQuery();
myCmd.Dispose();
myConn.Close();
GridView1.EditIndex = -1;
this.bind();
}
最后找到错误原因:为了运行此例子,新建个数据库,没有把id设置为主键,前两个id竟然是空的
所以GridView1.DataKeys[]的值是空
总结:
asp.net不难,对于初学却很复杂,我感觉就仿佛是路人甲写的一堆类,太多太杂,只能硬记.
上述两个错误并不是因为马虎,而是整个熟练度不高.
这让我想起当时刚接触MFC,即此种情况,经常一个小问题鼓捣半天也解决不了,而且问别人或查网络根本没有答案(因为都是无意之失,并不典型,只能靠自己一点一点排除)
只有一点一点锻炼,孰能生巧.