当前位置:编程学习 > C#/ASP.NET >>

gridview中checkbox控件绑定数据的问题(100分)

我正在做一个权限设置的模块,希望通过gridview实现,设想是gridview的列是根据数据库的字段动态生成的  每个列头就是数据库字段名,列中是控件checkbox ,checkbox是否被选中根据数据库中另外一个表的数据
现在的问题是能动态生成列了,但是怎么给checkbox控件绑定数据啊~~ --------------------编程问答-------------------- 你那一列是什么字段,Bit 类型,还是 Boolean型,
--------------------编程问答-------------------- 先转换成模版列.绑定然后 --------------------编程问答-------------------- <asp:TemplateColumn ItemStyle-Wrap="False" ItemStyle-Width="22">
<ItemTemplate>
<asp:CheckBox Runat="server" Width="22" ID="chx_sel2" Enabled='<%# !((bool)DataBinder.Eval(Container.DataItem, "readonly")) %>' Checked='<%# ((bool)DataBinder.Eval(Container.DataItem, "selected")) %>' >
</asp:CheckBox>
</ItemTemplate>
</asp:TemplateColumn> --------------------编程问答-------------------- readonly 和 selected 是你数据源的两列,这两列最好用bit,或者整型的0,1 --------------------编程问答-------------------- 是什么类型都可以~因为数据库是自己设计的 

我想问再后台代码中怎么给checkbox设置绑定数据 --------------------编程问答-------------------- 顶一下。
gridview在放一个控件试试
--------------------编程问答--------------------  XmlDocument doc = new XmlDocument();
    protected void Page_Load(object sender, EventArgs e)
    {

        for (int index = 1; index < GridView1.Columns.Count; index++)
        {
            GridView1.Columns[index].Visible = false;
        }

        //调用MetadataService服务的SensorsQuery方法,返回所有的传感器

        //XmlDocument doc = new XmlDocument();
        doc.LoadXml("<Satellites><Satellite satName='LANDSAT_5'><Sensors><Sensor sensorName='TM' extName='met' length='32768'/></Sensors></Satellite><Satellite satName='LANDSAT_7'><Sensors><Sensor sensorName='ETM' extName='met' length='32768'/></Sensors></Satellite><Satellite satName='ENVISAT'><Sensors><Sensor sensorName='ASAR' extName='N1' length='8100'/></Sensors></Satellite></Satellites>");

        XmlNodeList satellite_nl = doc.DocumentElement.ChildNodes;
        for (int i = 0; i < satellite_nl.Count; i++)
        {
            XmlElement satNode = (XmlElement)satellite_nl[i];
            string satName = satNode.GetAttribute("satName");
            XmlNodeList sensor_nl = satNode.FirstChild.ChildNodes;
            for (int j = 0; j < sensor_nl.Count; j++)
            {
                XmlElement senNode = (XmlElement)sensor_nl[j];
                string senName = senNode.GetAttribute("sensorName");

                //动态添加GridView列
                TemplateField tf = new TemplateField();
                tf.ShowHeader = true;
                tf.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header, satName + "_" + senName);
                tf.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, satName + "_" + senName);
                GridView1.Columns.Add(tf);
                GridView1.DataSource = CreateDataSource();
                GridView1.DataBind();
            }

        }
    }
    ICollection CreateDataSource()
    {
        DataTable dt = new DataTable();
        DataRow dr;
        dt.Columns.Add(new DataColumn("id", typeof(Int32)));
        dt.Columns.Add(new DataColumn("UserName", typeof(string)));
        XmlNodeList satellite_nl = doc.DocumentElement.ChildNodes;
        for (int i = 0; i < satellite_nl.Count; i++)
        {
            XmlElement satNode = (XmlElement)satellite_nl[i];
            string satName = satNode.GetAttribute("satName");
            XmlNodeList sensor_nl = satNode.FirstChild.ChildNodes;
            for (int j = 0; j < sensor_nl.Count; j++)
            {
                XmlElement senNode = (XmlElement)sensor_nl[j];
                string senName = senNode.GetAttribute("sensorName");

                dt.Columns.Add(new DataColumn(satName + "_" + senName, typeof(int)));
            }

        }

        SqlConnection con = new SqlConnection();
        con.ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        cmd.CommandText = "select * from Users where UserState = '是'";

        con.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        int userNum = 0;
        while (reader.Read())
        {
            dr = dt.NewRow();
            dr[0] = userNum+1;
            dr[1] = reader["UserName"].ToString();
            dr[2] = 0;
            dr[3] = 1;
            dr[4] = 0;
            dt.Rows.Add(dr);
            userNum++;
        }
        con.Close();
        

        DataView dv = new DataView(dt);
        return dv;
    }
    public class GridViewTemplate : ITemplate
    {
        private DataControlRowType dcrType;
        private string columnName;
        public GridViewTemplate(DataControlRowType type, string colname)
        {
            dcrType = type;
            columnName = colname;
        }
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (dcrType)
            {
                case DataControlRowType.Header:
                    Literal literal = new Literal();
                    literal.Text = columnName;
                    container.Controls.Add(literal);
                    break;
                case DataControlRowType.DataRow:
                    CheckBox cb = new CheckBox();
                    cb.ID = columnName;
                    cb.Text = "";
                    cb.AutoPostBack = true;
                    //cb.Checked = Convert.ToInt32(DataBinder.Eval(Container.DataItem, "columnName")) == 1 ? true : false;
                    container.Controls.Add(cb);
                    break;
                default:
                    break;
            }
        }
    }

这是我的代码 --------------------编程问答--------------------  #region"権限より編集ボタンの状態を処理する"
    /// <summary>
    /// 権限より編集ボタンの状態を処理する
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void gvQuestionlist_RowDataBound1(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex > -1)
        {
            String strUserId = Convert.ToString(Session["USER_ID"]);
            String strUserType = Convert.ToString(Session["USER_TYPE_ID"]);
            DataRowView rv = (DataRowView)e.Row.DataItem;
            // 説明を取得する
            if (rv["QUESTION_MEMO"].ToString().Length != 0)
            {
                Label label = (Label)e.Row.FindControl("Label1");
                label.Text =lblSubstr(rv["QUESTION_MEMO"].ToString(), 38);
            }

            //
            if ( rv["QUESTION_END"].ToString() == "是" || Convert.ToInt32 (rv["ANSWER_COUNT"].ToString()) >0)
            {
                ((LinkButton)e.Row.Cells[11].Controls[0]).Enabled = false;               
            }

            // 管理者ではない
            if (strUserType != ConfigurationManager.AppSettings["USER_TYPE_01"])
            {
                CheckBox chkDelete = (CheckBox)e.Row.FindControl("chkDelete");
                chkDelete.Enabled = false;
                

                // 自分のリソースではない場合
                if (rv["CREATOR"].ToString() != strUserId)
                {
                    ((LinkButton)e.Row.Cells[11].Controls[0]).Enabled = false;
                }
            }
        }
    }
    #endregion
  
*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 

http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html --------------------编程问答-------------------- 绑定什么属性就在属性里用上绑定当前行某字段语句,如3楼 --------------------编程问答-------------------- 怎么在后台代码里设置绑定?? --------------------编程问答--------------------
引用 10 楼 lngn1 的回复:
怎么在后台代码里设置绑定??

仔细看看3楼,你问的东西很晕~~~ --------------------编程问答-------------------- 上面我贴出了自己的代码~你们看看怎么修改?? --------------------编程问答-------------------- 当然后台也可以动态绑定,但是在前台这样写多方便多明了啊 --------------------编程问答-------------------- 这些列都是动态生成的~怎么在前台写啊?
前台代码:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField HeaderText="用户名" DataField="UserName" />
                </Columns>
</asp:GridView>

????怎么弄????? --------------------编程问答--------------------
引用 11 楼 only_endure 的回复:
引用 10 楼 lngn1 的回复:
怎么在后台代码里设置绑定?? 
 
仔细看看3楼,你问的东西很晕~~~
--------------------编程问答-------------------- 不太懂~~ --------------------编程问答-------------------- 来晚了 --------------------编程问答-------------------- 把所有列轉變成模板列 然後梆定 --------------------编程问答-------------------- --------------------编程问答-------------------- 可以在 grid 的 RowDataBound 方法中设置,
根据不用的值控制checkbox是否被选中。

DataRowView data = (DataRowView)e.Row.DataItem; // 获取数据行
CheckBox ck0 = (CheckBox )e.Row.FindControl("ck0"); // ck0 是模版列中的CheckBox的ID
if (data["column0"].ToString() == "1")
    ck0.Checked = true; 

....

保存的时候也要反方向判断一次才可以。


--------------------编程问答-------------------- 这个其实也很简单.你就当没有GRIDVIEW一样的操作.

数据你为数据库里面是BIT类型.那你直接把值取出来给CHECKED就行了. --------------------编程问答-------------------- guanzhu --------------------编程问答-------------------- nj_1st_excellence 兄弟的方法可以`
问题是一翻页就出错~~不知怎么解决~~如果能帮我解决 ~我可以再发帖放分 --------------------编程问答-------------------- 可以通过两张表联接,绑定就行了。如何你的选项是BOOL型的。 --------------------编程问答--------------------
引用 24 楼 exiori 的回复:
可以通过两张表联接,绑定就行了。如何你的选项是BOOL型的。
能说清楚点吗~~~
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,