首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

GridView中怎么加入DropDownList和CheckBox等控件的問題

2012-12-15 
GridView中如何加入DropDownList和CheckBox等控件的問題GridView的設計是6列:第一列為行號;第二列為checkb

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对服务器压力较小。
[其他解释]
简体中文
[其他解释]
引用:

http://blog.csdn.net/21aspnet/article/details/1540301
自己去看,里面都有


正在學習它的第四個例子。
其中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这个字段吧,我数据库里明明是有这个字段的

[其他解释]
引用:
http://blog.csdn.net/21aspnet/article/details/1540301
自己去看,里面都有

我就是照着里面的例子做的,还是出问题。
区别是例子中使用SqlDataAdapter,而我是自定义的读表用的表对象
大家帮忙看一下吧,在线等
[其他解释]
那你看下GetDataSource方法中返回TerminalNo这一列了吗,比如你数据库中有这个字段,但是你的select语句中用的不是*,而是手动指定的字段,那么你很可能没有在select中列出这一列
[其他解释]
引用:
那你看下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
[其他解释]

引用:
<asp:DropDownList ID="Ddl_TermNo" runat="Server" DataSource='<%# GetDropData()%>' 
                    DataValueField="TerminalNo" DataTextField="TerminalNo">
                </asp:DropDownList>

……

使用jquery的话,前台的代码具体怎么写呢?我刚开始接触,语法什么的都不懂额
[其他解释]
哥们用baidu 或者Google吧;关键字:jquery select
[其他解释]
引用:
  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吗?直接写到前台就好了


answer:这里的数据是暂时搭建的,以后可能会读数据库




引用:
你跟踪下ds中的数据看下,这种提示,几乎就是你写的列名和返回集合中的字段名不一致造成的

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;
        }


[其他解释]

引用:
哥们用baidu 或者Google吧;关键字:jquery select

好的,我后期会改一下,现在以实现功能为主。
谢谢你的建议!

热点排行