GridView中如何加入DropDownList和CheckBox等控件的
GridView的是6列:
第一列行;
第二列checkbox,用表示中前行(可同多行);
第三至第六列取的:
第三列:只的TextBox;
第四列:可的TextBox;
第五列:DropDownList(datasource另);
第六列:只的TextBox。中的2列拼合(yyyy/mm/dd hh:mm),在服器端代中用了string的拼接,如果有更好的方法教;
需求是入面后,Grid中的非只控件都可直接操作
以下是客端的代
1、加了checkbox,可以示,但不清楚取中的用法;
2、加了DropDownList,定之前只能示成TextBox的子。而在服器端定后,程序
<asp:GridView ID="GridView1" runat="server" Font-Size="Medium" BackColor="Gray"
CellPadding="1" AllowSorting="True"
onrowcreated="GridView1_RowDataBound" >
<Columns>
<asp:TemplateField HeaderText="">
<ItemTemplate>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<input ID="Checkbox1" type="checkbox" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="端末№">
<ItemTemplate>
<asp:DropDownList id="dlTerNo" runat="Server" autopostback="true" >
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
以下是服器端代:
1、在在GridView中加入控件之前,先做了入示,已成功。使用的是DataTable建Columns
public partial class Page1 : System.Web.UI.Page
{
int m_nDataRow = 0;
CTblDUADDINF m_dbData = new CTblDUADDINF();
STCDUADDINF[] m_aDuaddinf = null;
struct STCDUADDINF
{
public string strMacAddress;
public string strCompanyCode;
public int nTerminalNo;
public int nAccessYMD;
public short nAccessHM;
};
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.DataSource = GetDataSource();
GridView1.DataBind();
}
}
protected bool ReadDUADDINF()// 打表
{
string strSql = string.Format("select {0}, {1}, {2}, {3}, {4} From {5}", CTblDUADDINF.S_MacAddress, CTblDUADDINF.S_CompanyCode, CTblDUADDINF.S_TerminalNo, CTblDUADDINF.S_AccessYMD, CTblDUADDINF.S_AccessHM, CTblDUADDINF.S_Tbl_Name);
m_dbData.Open(strSql, out m_nDataRow);
if (m_nDataRow > 0)
{
return true;
}
return false;
}
private DataTable GetDataSource()// 取
{
int nCnt = 0;
DataTable dt = new DataTable();
if (!IsPostBack)
{
if (ReadDUADDINF())
{
m_aDuaddinf = null;
m_aDuaddinf = new STCDUADDINF[m_nDataRow];
for (nCnt = 0; nCnt < m_nDataRow; nCnt++)
{
m_aDuaddinf[nCnt].strMacAddress = m_dbData.m_data.Tables[0].Rows[nCnt]["MacAddress"].ToString().Trim();
m_aDuaddinf[nCnt].strCompanyCode = m_dbData.m_data.Tables[0].Rows[nCnt]["CompanyCode"].ToString();
m_aDuaddinf[nCnt].nTerminalNo = (short)m_dbData.m_data.Tables[0].Rows[nCnt]["TerminalNo"];
m_aDuaddinf[nCnt].nAccessYMD = (int)m_dbData.m_data.Tables[0].Rows[nCnt]["AccessYMD"];
m_aDuaddinf[nCnt].nAccessHM = (short)m_dbData.m_data.Tables[0].Rows[nCnt]["AccessHM"];
}
}
//dt.Columns.Add(" ", typeof(string));
//dt.Columns.Add("", typeof(bool));
dt.Columns.Add("会社コド", typeof(string));
dt.Columns.Add("端末ノドアドレス", typeof(string));
dt.Columns.Add("端末№", typeof(int));
dt.Columns.Add("最新アクセス", typeof(string));
for (nCnt = 0; nCnt < m_nDataRow; nCnt++)
{
DataRow dr = dt.NewRow();
//dr[" "] = nCnt.ToString();
//dr[""] = 1;
dr["会社コド"] = m_aDuaddinf[nCnt].strCompanyCode;
dr["端末ノドアドレス"] = m_aDuaddinf[nCnt].strMacAddress;
dr["端末№"] = m_aDuaddinf[nCnt].nTerminalNo.ToString();
string strTemp1 = m_aDuaddinf[nCnt].nAccessYMD.ToString();
strTemp1 = strTemp1.Substring(0, 4) + "/" + strTemp1.Substring(4, 2) + "/" + strTemp1.Substring(6);
string strTemp2 = m_aDuaddinf[nCnt].nAccessHM.ToString();
strTemp2 = strTemp2.Substring(0, 2) + ":" + strTemp2.Substring(2);
dr["最新アクセス"] = strTemp1 + " " + strTemp2;
dt.Rows.Add(dr);
}
}
return dt;
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
// 第一列示行
if (e.Row.RowIndex != -1)
{
int id = e.Row.RowIndex + 1;
e.Row.Cells[0].Text = id.ToString();
}
// 第五列用DropDownList示,失。。
if (e.Row.RowType == DataControlRowType.DataRow)
{
if ((DropDownList)e.Row.FindControl("dlTerNo") != null)
{
DropDownList dlTerNo = (DropDownList)e.Row.FindControl("dlTerNo");
dlTerNo.DataSource = GetDropData();
dlTerNo.DataTextField = "name";
dlTerNo.DataValueField = "id";
dlTerNo.DataBind();
}
}
}
private DataTable GetDropData()// DropDownList取
{
DataTable dt = new DataTable();
dt.Columns.Add("1", typeof(int));
for (int nCnt = 0; nCnt < 3; nCnt++)
{
DataRow dr = dt.NewRow();
dr["1"] = nCnt;
dt.Rows.Add(dr);
}
return dt;
}
}
在我最大的就是在GridView中建列,究竟是模板列是在CS中用datatable。
本人始接ASP.NET,法不是很熟,各位回答的候量一些,!
[最优解释]
你跟踪下ds中的数据看下,这种提示,几乎就是你写的列名和返回集合中的字段名不一致造成的
[其他解释]
http://blog.csdn.net/21aspnet/article/details/1540301
自己去看,里面都有
[其他解释]
<asp:DropDownList?ID="Ddl_TermNo"?runat="Server"?DataSource='<%#?GetDropData()%>'?
????????????????????DataValueField="TerminalNo"?DataTextField="TerminalNo">
????????????????</asp:DropDownList>
这里面的 DataSource 指的是数据源控件,向你这个情况可以分几种绑定。
一种通过jquery 在 dropdownlist 的onclick 事件上处理;
一种是gridview的databouned 的事件 ,找到每一个控件(dropdownlist)进行数据源绑定;
推荐用jquery对服务器压力较小。
[其他解释]
简体中文
[其他解释]
正在它的第四例子。
其中DropDownList的DataSource='<%# ddlbind()%>'所用定的函,在CS端用的是public SqlDataReader ddlbind()型是不是只?我是需要修改的。
我已修改成:
<asp:DropDownList ID="Ddl_TermNo" runat="Server" DataSource='<%# GetDropData()%>'
DataValueField="端末№" DataTextField="端末№">
private DataTable GetDropData()
{
DataTable dt = new DataTable();
dt.Columns.Add("1", typeof(int));
for (int nCnt = 0; nCnt < 3; nCnt++)
{
DataRow dr = dt.NewRow();
dr["1"] = nCnt;
dt.Rows.Add(dr);
}
return dt;
}
但是程序后
行 56: <asp:TemplateField HeaderText="端末№">
行 57: <ItemTemplate>
行 58: <asp:DropDownList ID="Ddl_TermNo" runat="Server" DataSource='<%# GetDropData()%>' 行 59: DataValueField="端末№" DataTextField="端末№">
行 60: </asp:DropDownList>
法麽?怎麽?
[其他解释]
同求~
[其他解释]
目前的进展是:
<asp:GridView ID="GridView1" runat="server" Font-Size="9pt" BackColor="White"
AllowSorting="True" AutoGenerateColumns="False" CellPadding="3"
BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
>
<Columns>
<asp:TemplateField HeaderText="">
</asp:TemplateField>
<asp:TemplateField HeaderText="">
<ItemTemplate>
<input ID="Checkbox1" type="checkbox" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CompanyCode" HeaderText="会社コド" SortExpression="会社コド" />
<asp:BoundField DataField="MacAddress" HeaderText="端末ノドアドレス" SortExpression="端末ノドアドレス" />
<asp:TemplateField HeaderText="端末№">
<ItemTemplate>
<asp:DropDownList ID="Ddl_TermNo" runat="Server" DataSource='<%# GetDropData()%>'
DataValueField="TerminalNo" DataTextField="TerminalNo">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="AccessYMD" HeaderText="最新アクセス" SortExpression="最新アクセス" />
</Columns>
<RowStyle ForeColor="#000066" />
</asp:GridView>
public partial class Page1 : System.Web.UI.Page
{
int m_nDataRow = 0;
CTblDUADDINF m_dbData = new CTblDUADDINF();//自定义的表对象
protected void Page_Load(object sender, EventArgs e)
{
DropDownList ddl;
if (!IsPostBack)
{
DataSet ds = new DataSet();
ds = GetDataSource();//从数据库中读出的dataset
GridView1.DataSource = ds;
GridView1.DataBind();// 程序跑到这里崩了,错误见下图
// 设置dropdownlist当前选中的项
for (m_nDataRow = 0; m_nDataRow < GridView1.Rows.Count - 1; m_nDataRow++)
{
DataRowView drv = ds.Tables[0].DefaultView[m_nDataRow];
if (Convert.ToString(drv["TerminalNo"]).Trim() == "0")
{
ddl = (DropDownList)GridView1.Rows[m_nDataRow].FindControl("Ddl_TermNo");
ddl.SelectedIndex = 0;
}
else if (Convert.ToString(drv["TerminalNo"]).Trim() == "1")
{
ddl = (DropDownList)GridView1.Rows[m_nDataRow].FindControl("Ddl_TermNo");
ddl.SelectedIndex = 1;
}
else if (Convert.ToString(drv["TerminalNo"]).Trim() == "2")
{
ddl = (DropDownList)GridView1.Rows[m_nDataRow].FindControl("Ddl_TermNo");
ddl.SelectedIndex = 2;
}
}
}
}
protected bool ReadDUADDINF()// 读表
{
string strSql = string.Format("select {0}, {1}, {2}, {3} From {4}", CTblDUADDINF.S_CompanyCode, CTblDUADDINF.S_MacAddress, CTblDUADDINF.S_TerminalNo, CTblDUADDINF.S_AccessYMD, CTblDUADDINF.S_Tbl_Name);
m_dbData.Open(strSql, out m_nDataRow);
if (m_nDataRow > 0)
{
return true;
}
return false;
}
protected DataSet GetDataSource()
{
int nCnt = 0;
DataTable dt = new DataTable();
if (!IsPostBack)
{
if (ReadDUADDINF())
{
return m_dbData.m_data;// 自定义的表对象,返回的是dataset类型
}
DataSet ds = new DataSet();
return ds;//这里应该不会跑到,随便写的
}
protected DataSet GetDropData()// dropdownlist中的候选项
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("1", typeof(int));
for (int nCnt = 0; nCnt < 3; nCnt++)
{
DataRow dr = dt.NewRow();
dr["1"] = nCnt;
dt.Rows.Add(dr);
}
ds.Tables.Add(dt);
return ds;
}
意思大概是说GridView里没有TerminalNo这个字段吧,我数据库里明明是有这个字段的
[其他解释]
我就是照着里面的例子做的,还是出问题。
区别是例子中使用SqlDataAdapter,而我是自定义的读表用的表对象
大家帮忙看一下吧,在线等
[其他解释]
那你看下GetDataSource方法中返回TerminalNo这一列了吗,比如你数据库中有这个字段,但是你的select语句中用的不是*,而是手动指定的字段,那么你很可能没有在select中列出这一列
[其他解释]
select的时候加了这个字段了,在ReadDUADDINF()函数中的
string strSql = string.Format("select {0}, {1}, {2}, {3} From {4}", CTblDUADDINF.S_CompanyCode, CTblDUADDINF.S_MacAddress, CTblDUADDINF.S_TerminalNo, CTblDUADDINF.S_AccessYMD, CTblDUADDINF.S_Tbl_Name);
调试的时候,在open之后,看了下数据,也已经把数据读出来了
[其他解释]
晕了,GridView.DataSource = ds.Tables[0].defaultview
[其他解释]
private DataTable GetDropData()// DropDownList取
{
DataTable dt = new DataTable();
dt.Columns.Add("1", typeof(int));
for (int nCnt = 0; nCnt < 3; nCnt++)
{
DataRow dr = dt.NewRow();
dr["1"] = nCnt;
dt.Rows.Add(dr);
}
return dt;
}
-----------------------
你的数据只有 0、1、2吗?直接写到前台就好了
[其他解释]
mark
[其他解释]
使用jquery的话,前台的代码具体怎么写呢?我刚开始接触,语法什么的都不懂额
[其他解释]
哥们用baidu 或者Google吧;关键字:jquery select
[其他解释]
answer:这里的数据是暂时搭建的,以后可能会读数据库
answer:恩,我做出来了,确实像你所说的。我之前一直都在关注gridview里的字段名一致的问题,忽略了DropDownList中columns字段名了
以下是修改后的代码:
private DataTable GetDropData()// DropDownList取
{
DataTable dt = new DataTable();
dt.Columns.Add("TerminalNo", typeof(int));
for (int nCnt = 0; nCnt < 3; nCnt++)
{
DataRow dr = dt.NewRow();
dr["TerminalNo"] = nCnt;
dt.Rows.Add(dr);
}
return dt;
}
[其他解释]
好的,我后期会改一下,现在以实现功能为主。
谢谢你的建议!