最近因为手上项目实现类似的效果,所以在网上查阅了相关代码发现有两处不错误!一个是致命的错误会导致程序异常中断。一个是逻辑错误,如果数据没有按要求排序的话可能会造成达不到预定效果!为了说明问题,附上网上关于此问题解决方案的代码。
效果图:
后台代码: using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default4 : System.Web.UI.Page
{
SqlConnection sqlcon;
string strCon = "Data Source=(local);Database=北风贸易;Uid=sa;Pwd=sa";
protected void Page_Load(object sender, EventArgs e)
{
DropDownList ddl;
if (!IsPostBack)
{
string sqlstr = "select top 5 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
GridView1.DataSource = myds;
GridView1.DataBind();
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DataRowView mydrv = myds.Tables["飞狐工作室"].DefaultView[i];
if (Convert.ToString(mydrv["员工性别"]).Trim() == "True")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "False")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
sqlcon.Close();
}
}
public SqlDataReader ddlbind()
{
string sqlstr = "select distinct 员工性别 from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlCommand sqlcom = new SqlCommand(sqlstr, sqlcon);
sqlcon.Open();
return sqlcom.ExecuteReader();
}
前台主要代码:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
CellPadding="3" Font-Size="9pt" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px">
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:BoundField DataField="身份证号码" HeaderText="用户ID" SortExpression="身份证号码" />
<asp:BoundField DataField="姓名" HeaderText="用户姓名" SortExpression="姓名"/>
<asp:TemplateField HeaderText="员工性别">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSource='<%# ddlbind()%>' DataValueField="员工性别" DataTextField="员工性别">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="家庭住址" HeaderText="家庭住址" SortExpression="家庭住址"/>
</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>
好!看完上述代码后,我们来谈谈这段代码的错误。
一、上述代码首先就不能正常运行。错误截图如下:
相信大多数看官应该明白了,我个错误的大意是在表T_Test中没有员工性别这个字段。也就是下述这段代码造成了这个错误!
string sqlstr = "select top 5 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
GridView1.DataSource = myds;
GridView1.DataBind();
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DataRowView mydrv = myds.Tables["飞狐工作室"].DefaultView[i];
if (Convert.ToString(mydrv["员工性别"]).Trim() == "男")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "女")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
因为.NET在运行时没有找到员工性别这个字段。所以会报错。解决方法有两种。
一、把
mydrv["员工性别"]).中的员工性别换成是数据库中真实字段的名称。
二、把上面string sqlstr = "select top 5 * from 飞狐工作室";这句代码改写为如下格式
string sqlstr = "select 身份证号码 as 用户ID, 姓名 as 用户姓名,distinct as 员工性别, 家庭住址 as 家庭住址 from 飞狐工作室";
同时把前台HTML代码中关于GridView部份的代码改写不要在前台绑定字段。否则也会报错。
在此给这篇文章的原创作者一个建议。数据库中最好不要用中文为字段名,SQL Server 对中文的支持不是很好。而且在我看来这个数据库是洋枪土炮一起上了。员工性别字段又是“distinct”。这不是一个好的编码习惯!
第二处错误也是逻辑错误。假设数据库中的第一条记录和第二条记录中的员工性别这一字段是相同的话,你就准备跑路吧!乱给别人改性别。估计你会被K的很难看。原因是以下代码造成的。
public SqlDataReader ddlbind()
{
string sqlstr = "select distinct 员工性别 from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlCommand sqlcom = new SqlCommand(sqlstr, sqlcon);
sqlcon.Open();
return sqlcom.ExecuteReader();
}
在前台你又使用了动态绑定调用了此方法
<asp:TemplateField HeaderText="员工性别">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSource='<%# ddlbind()%>' DataValueField="员工性别" DataTextField="员工性别">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
结果就造成了我上面所情况。以下是我根据我所述的情况截的图。
好吗!现在全成女同胞了。你看李剑勇多充满阳刚的名字,愣是被你一整,好家伙成女的了。哎!无语!
在看看数据库中的吧!
ddlbind()方法是把数据库中的记录取出来了,不信你看图
嘿嘿!可惜你的如下代码造就这种情况
if (Convert.ToString(mydrv["员工性别"]).Trim() == "男")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "女")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
是男的选DropDownList控件中的第一项,是女的选第二项。可是你DropDownList控件可不止这两项。除非在数据库中第一条记录和第二条记录按你的意思来,一个男一个女就不会出现这样的情况。但是现实中我说的情况是大有可能出现的。这就是逻辑错误了!
下次我将更改此错误。现在不行了各位看官。我情人也就是周公的女儿在
最近因为手上项目实现类似的效果,所以在网上查阅了相关代码发现有两处不错误!一个是致命的错误会导致程序异常中断。一个是逻辑错误,如果数据没有按要求排序的话可能会造成达不到预定效果!为了说明问题,附上网上关于此问题解决方案的代码。
效果图:
后台代码:
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class Default4 : System.Web.UI.Page
{
SqlConnection sqlcon;
string strCon = "Data Source=(local);Database=北风贸易;Uid=sa;Pwd=sa";
protected void Page_Load(object sender, EventArgs e)
{
DropDownList ddl;
if (!IsPostBack)
{
string sqlstr = "select top 5 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
GridView1.DataSource = myds;
GridView1.DataBind();
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DataRowView mydrv = myds.Tables["飞狐工作室"].DefaultView[i];
if (Convert.ToString(mydrv["员工性别"]).Trim() == "True")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "False")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
sqlcon.Close();
}
}
public SqlDataReader ddlbind()
{
string sqlstr = "select distinct 员工性别 from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlCommand sqlcom = new SqlCommand(sqlstr, sqlcon);
sqlcon.Open();
return sqlcom.ExecuteReader();
}
前台主要代码:
<asp:GridView ID="GridView1" runat="server" AllowSorting="True" AutoGenerateColumns="False"
CellPadding="3" Font-Size="9pt" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px">
<FooterStyle BackColor="White" ForeColor="#000066" />
<Columns>
<asp:BoundField DataField="身份证号码" HeaderText="用户ID" SortExpression="身份证号码" />
<asp:BoundField DataField="姓名" HeaderText="用户姓名" SortExpression="姓名"/>
<asp:TemplateField HeaderText="员工性别">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" DataSource='<%# ddlbind()%>' DataValueField="员工性别" DataTextField="员工性别">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="家庭住址" HeaderText="家庭住址" SortExpression="家庭住址"/>
</Columns>
<RowStyle ForeColor="#000066" />
<SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
<HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
</asp:GridView>
好!看完上述代码后,我们来谈谈这段代码的错误。
一、上述代码首先就不能正常运行。错误截图如下:
相信大多数看官应该明白了,我个错误的大意是在表T_Test中没有员工性别这个字段。也就是下述这段代码造成了这个错误!
string sqlstr = "select top 5 * from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds, "飞狐工作室");
GridView1.DataSource = myds;
GridView1.DataBind();
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
DataRowView mydrv = myds.Tables["飞狐工作室"].DefaultView[i];
if (Convert.ToString(mydrv["员工性别"]).Trim() == "男")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "女")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
因为.NET在运行时没有找到员工性别这个字段。所以会报错。解决方法有两种。
一、把
mydrv["员工性别"]).中的员工性别换成是数据库中真实字段的名称。
二、把上面string sqlstr = "select top 5 * from 飞狐工作室";这句代码改写为如下格式
string sqlstr = "select 身份证号码 as 用户ID, 姓名 as 用户姓名,distinct as 员工性别, 家庭住址 as 家庭住址 from 飞狐工作室";
同时把前台HTML代码中关于GridView部份的代码改写不要在前台绑定字段。否则也会报错。
在此给这篇文章的原创作者一个建议。数据库中最好不要用中文为字段名,SQL Server 对中文的支持不是很好。而且在我看来这个数据库是洋枪土炮一起上了。员工性别字段又是“distinct”。这不是一个好的编码习惯!
第二处错误也是逻辑错误。假设数据库中的第一条记录和第二条记录中的员工性别这一字段是相同的话,你就准备跑路吧!乱给别人改性别。估计你会被K的很难看。原因是以下代码造成的。
public SqlDataReader ddlbind()
{
string sqlstr = "select distinct 员工性别 from 飞狐工作室";
sqlcon = new SqlConnection(strCon);
SqlCommand sqlcom = new SqlCommand(sqlstr, sqlcon);
sqlcon.Open();
return sqlcom.ExecuteReader();
}
在前台你又使用了动态绑定调用了此方法
<asp:TemplateField HeaderText="员工性别">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server"
DataSource='<%# ddlbind()%>' DataValueField="员工性别" DataTextField="员工性别">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
结果就造成了我上面所情况。以下是我根据我所述的情况截的图。
好吗!现在全成女同胞了。你看李剑勇多充满阳刚的名字,愣是被你一整,好家伙成女的了。哎!无语!
在看看数据库中的吧!
ddlbind()方法是把数据库中的记录取出来了,不信你看图
嘿嘿!可惜你的如下代码造就这种情况
if (Convert.ToString(mydrv["员工性别"]).Trim() == "男")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 0;
}
if (Convert.ToString(mydrv["员工性别"]).Trim() == "女")
{
ddl = (DropDownList)GridView1.Rows[i].FindControl("DropDownList1");
ddl.SelectedIndex = 1;
}
}
是男的选DropDownList控件中的第一项,是女的选第二项。可是你DropDownList控件可不止这两项。除非在数据库中第一条记录和第二条记录按你的意思来,一个男一个女就不会出现这样的情况。但是现实中我说的情况是大有可能出现的。这就是逻辑错误了!
下次我将更改此错误。现在不行了各位看官。我情人也就是周公的女儿在呼叫我。我给下了!