超级难,!!!
生成3维DataTable要求根据查询条件把查询结果生成为这样的一个DataTable------------------------------------
序号| 课程名称 | 资料 | 光盘 | 讲义
------------------------------------
1   |   数学   |#选中 |      |#选中
------------------------------------
2   |   语文   |      | #选中|#选中
------------------------------------
3   |   历史   |      |      |#代表一个复选框
后三列名是动态的(从数据库表中获得),即:除了资料、光盘、讲义外还可能有别的类别。如:图片课程名称列是从数据库中查找的,即:数学、语文、历史,取自数据库。(还有别的课。。)然后,
根据课程名称,从数据库表中查询是否有相应的资料、 光盘、 讲义(等等类别),
有,则在单元格中显示一个复选框。(并要为此复选框添加单击事件)
无,则显示空白。-----------------------------简直晕了,,,,
哪位大哥给指点一下,俺一点思路都没有了
本来俺认为弄个循环嵌套就行了,可编来编去发现没法循环嵌套啊,越编越乱,根本实现不了
大虾们给俺点思路,有例程最好了100分一定奉上。!!!

解决方案 »

  1.   

    先从数据库里取出数据,然后跟DataGrid绑定,使用DataGrid的模板来显示
      

  2.   

    按照你的想法是一定可以实现的,不要灰心,继续努力!!!我以前做过类似的东西,根据查询结果:
    1、创建一个自定义列的DataTable;
    2、向创建好的DataTable中一行一行地写入数据;
    3、绑定到DataGrid中去。整个过程有点儿麻烦,需要耐心地去调试,我是写了差不多3天才完成的。
      

  3.   

    你设计数据库的时候应该考虑一下结构,资料、光盘、讲义最好最成字典表,用字段来表示,
    并且这三列做成模版列,不要用动态模版列,根据的你查询情况,看看有没有资料、光盘、讲义这几项,来设置模版列的显示与否。
    比如说资料的字段0表示有,1表示无。那么select count(*) from table where 资料=0.如果count为0,datagrid对应的列visible为ture,否则为flase.复选框,也就是checkbox,放入模版列中,邦定datagrid的时候不要管它,你在itemdatabond事件中进行checkbox的判断,数据中为0的时候,选中,否则不选中。那个checkbox的事件<asp:TemplateColumn HeaderText="&#65418;&#65415;&#65399;&#65379;&#65430;&#65401;">
    <ItemTemplate>
    <asp:CheckBox id="cbxIsstop" runat="server" AutoPostBack="True" OnCheckedChanged="check_chaged"></asp:CheckBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    public void check_chaged(object sender,System.EventArgs e)
    {
    RouteLineRules linerules = new RouteLineRules();
    routelineentity = (RouteLineEntity)ViewState["route"]; DataGridItem dgi = (DataGridItem)(((Control)sender).NamingContainer); cbxcheckbox=(CheckBox)dgi.Cells[5].FindControl("cbxIsstop");// string strIsstop = this.grdLineGov.Items[dgi.ItemIndex].Cells[3].Text;
    routelineentity.RouteIdChg = this.grdLineGov.Items[dgi.ItemIndex].Cells[4].Text;
    routelineentity.StoreCode = this.grdLineGov.Items[dgi.ItemIndex].Cells[5].Text; if(cbxcheckbox.Checked.Equals(true))
    {
    routelineentity.IsStop = 1;
    linerules.SetIsstop(routelineentity);
    }
    else if(cbxcheckbox.Checked.Equals(false))
    {
    routelineentity.IsStop = 0;
    linerules.SetIsstop(routelineentity);
    } linerules.BindRouteGird(ref grdLineGov,routelineentity);
    }参考这个来做
      

  4.   

    你用的什么数据库,如果是SQLServer的话就比较简单啦,你把存放数量的表结构给出来看一下呢,我把代码贴给你,比较简单!
      

  5.   

    to :gemininet(流星一闪) 俺用的是sql server
    与此相关的有5个表呢,不方便帖出来。能否先给一下例程的代码?
      

  6.   


    简单说一下表结构吧:
    1、课程表Course
    CourseID 
    CourseName
    CsID
    2、类别表(资料、光盘、图书等)Class
    ClassID
    ClassName3、教材资料资料表(即:资料、光盘、图书等东西)Book
    BookID
    BookName
    CsID
    ClassID4、课程资源信息 CsClass
    CsID
    ClassID
    status5、课程资源  (用不着) Cs
    CsID
    CsName(省略了这几个表中其他与本功能无关的字段)另外,
    这些表是主管设计创建的,虽然知道有些地方设计的不太合理,
    但俺无权修改表结构啊,
    整个系统比较大,因为还要和其他别的表(和本功能无关)联系
      

  7.   

    我做过比你难的,后面的列确实是动态生成的,我的方法是这样,你先构造一个DataTable,然后把查询出来的值,手动填充到DataTable中,最后再用DataGrid来显示。至少我没有找到更好的算法。
      

  8.   

    真是哗众取宠。
    很简单,不过代码繁琐而以
    首先,你取数据不能用sql,因为sql没办法做到动态列,用c#代码取出数据,放进dataset,不用教吧?
    根据列用代码画datagrid也不用教吧?
    就这么简单,不过画的代码很烦而以
      

  9.   

    你取数据时用case把 资料 | 光盘 | 讲义 这样的列转成true ,false 
    把checkbox控件的visible 属性绑定到这列
    加载时false的不会显示.
    控件事件正常添加.
      

  10.   

    你取数据时用case把 资料 | 光盘 | 讲义 这样的列的值转成true ,false 
    把checkbox控件的visible 属性绑定到这列
    加载时false的不会显示.
    控件事件正常添加.
      

  11.   

    存储过程放到临时表里生成一个dataset。一绑定就可以把
      

  12.   

    试试用Repeater控件,不要用Grid控件了,他虽然很强大但有时候不够灵活,在利用晚期绑定试试。我觉得可行,不过我也没试过。
      

  13.   

    用sql或存储过程可作!
    关键字group by, isnull或case
      

  14.   

    还绑定,DataGrid首先要解决的就是动态生成列,无论任何查询语句,其列数一定是固定的(除非是存储过程动态生成查询语句),这一点都没搞定就来绑定了?所以,首先要一个这样的表:
    ID 列名
    1  资料
    2  光盘
    3  讲义
    然后,动态生成一个二维表(DataTable),为它增加上面那个表的那些列,用DataTable.Columns.Add即可。
    在然后就是重新组合数据:ID 课程 列
    1  语文 讲义
    2  语文 资料不是这种格式想办法转成这种格式。
    最后是填充表先按课程分组,得到课程名,在结果表中一次性插入所有的行。
    然后再遍历上面的那个数据表,为结果表的各个列赋值。
      

  15.   

    using mysdd;
    using System.Web.UI.WebControls;
    using System.Data;
    namespace jsgb
    {
    /// <summary>
    /// 人员信息维护
    /// </summary>
    public class EmpModi : System.Web.UI.WebControls.WebControl
    {        private  string _p_number="";   
    private  System.Web.UI.WebControls.Table _table;
    private  string[] _ctl=new string[100];
    private  string[] _ctltype=new string[100];
    private  int g_ctl=0;
            private  int _moditype=0; //更新模式 0更新 1添加 //人员编号
    public string P_Number

     get
     { 
     return _p_number;
     }
     set
     {
       

     _p_number=value;
     if(value=="-1")
     {
     mysdd.db _tmp=new db();
     DataTable _tb=_tmp.gettable("select S_AA01_P_NUMBER.nextval from dual");
     _tmp.Dispose();
     _p_number=_tb.Rows[0][0].ToString();
     _moditype=1; //添加模式
    //  _tmp.showmsg(_moditype.ToString());  
     }

     }
       }
    /// <summary>
    /// 修改类型
    /// </summary>
    public int ModiType
    {
    get
    {
      return _moditype;
    }
    set
    {
      _moditype=value;
    }
    }
      //生成控件的容器Table
    public System.Web.UI.WebControls.Table UITable

    get
    {
    return  _table;
    }
    set

    _table=value;
    }
    } /// <summary>
    /// 创建初始控件
    /// </summary>
    public void CreateUI()
    { TableRow _trow=new TableRow();
    TableCell _tc=new TableCell();
    System.Web.UI.WebControls.DropDownList _ddl=new DropDownList();
    TextBox _txtbox=new TextBox(); JGField _jgfield=new JGField();
    Util _util=new Util();
    DataTable _tb=_jgfield.GetFieldInfo();
    DataTable _tbdic=_jgfield.GetFieldInfo();
    DataRow l_row; g_ctl=_tb.Rows.Count; _trow=new TableRow();
    for(int i=0;i<_tb.Rows.Count;i++)
    {
    l_row=_tb.Rows[i];
    _tc=new TableCell();
    _tc.Text=l_row["cfname"].ToString();
    _trow.Cells.Add(_tc);
    _tc=new TableCell();
    _ctl[i]=l_row["efname"].ToString();  //控件ID
    _ctltype[i]=l_row["d_type"].ToString();  //控件类型
    if((l_row["d_type"].ToString().Trim()=="C")&&(l_row["repdescrip"].ToString().Trim()!=""))
    {
    _ddl=new DropDownList();
    _ddl.ID=l_row["efname"].ToString();
    _ddl.DataTextField="c_brif";
    _ddl.DataValueField="e_expr";
    _tbdic=_util.GetDIC(l_row["repdescrip"].ToString());
    _ddl.DataSource=_tbdic.DefaultView;
    _ddl.DataBind();
    _tc.Controls.Add(_ddl);
    _trow.Cells.Add(_tc); }
    else if((l_row["d_type"].ToString().Trim()=="C")&&(l_row["repdescrip"].ToString().Trim()==""))
    {
    _txtbox=new TextBox();
    _txtbox.ID=l_row["efname"].ToString();
    _txtbox.CssClass="inputtext";
    //_txtbox.ToolTip=l_row["c_expr"].ToString();
    _tc.Controls.Add(_txtbox);
    _trow.Cells.Add(_tc); }
    else if(l_row["d_type"].ToString().Trim()=="D")
    {
    _txtbox=new TextBox();
    _txtbox.ID=l_row["efname"].ToString();
    _txtbox.CssClass="inputtext";
    //_txtbox.ToolTip=l_row["c_expr"].ToString();
    _txtbox.Attributes["onfocus"]="javascript:calendar();";
    _tc.Controls.Add(_txtbox);
    _trow.Cells.Add(_tc); }
    else
    {
    _txtbox=new TextBox();
    _txtbox.ID=l_row["efname"].ToString();
    _txtbox.CssClass="inputtext";
    //_txtbox.ToolTip=l_row["c_expr"].ToString();
    _tc.Controls.Add(_txtbox);
    _trow.Cells.Add(_tc);

    }
    if(i==0)
    {
    _tc=new TableCell();
    System.Web.UI.WebControls.Image _image=new System.Web.UI.WebControls.Image();
    _image.Width=Unit.Parse("110px");
    _image.Height=Unit.Parse("115px");
    _image.ToolTip="点击设置此人照片";
    _image.ID="emppic";
    string url="../comm/updatepic.aspx?number="+_p_number;
    _image.Attributes["onclick"]="javascipt:window.open(\""+url+"\",'','Toolbar =no,menubar=no,scrollbars=no,status=no,location=no,resizable =no,directories=no,width=450,height=100,top=334,left=287');";
    _image.Attributes["style"]="cursor:hand;";
    _image.ImageUrl="../comm/viewpic.aspx?p_number="+_p_number;  
    _tc.Controls.Add(_image);
    _tc.RowSpan=3;
    _trow.Cells.Add(_tc);  
    }
    if((i==1)||(i==2))
    {
    _table.Rows.Add(_trow);
    _trow=new TableRow();
    } if(i%2==0)
    {
    _table.Rows.Add(_trow);
    _trow=new TableRow();
    }

    }
    //处理权限及单位问题
    User _user=new User();
    if(_user.LoginStatus)
    {
      
        object _obj=_table.FindControl("AA01A03");
    if((_obj!=null)&&(_user.UserGroup!="01")) //不是系统组的用户处理
    {
     mysdd.basepage _tmp=new mysdd.basepage();
       _tmp.ddl_val((System.Web.UI.WebControls.DropDownList)_obj,_user.DepNum);
     ((System.Web.UI.WebControls.DropDownList)_obj).Enabled=false;
    }
     
    }
     
    }
      

  16.   

    /// <summary>
    /// 显示人员信息
    /// </summary>
    public void Display()
    {
    if(_moditype==1)  //添加模式不需要显示原有数据
    {
      return ;
    }
     
    Emp _emp=new Emp();
    mysdd.basepage  _tmp=new basepage();
    DataTable _tb=_emp.GetEmpValue(_p_number);  //取得人员信息;
    //取全部列名,如找到后在作处理 可能有效率问题
    for(int i=0;i<_tb.Columns.Count;i++)
    {
    object _obj=_table.FindControl(_tb.Columns[i].Caption); if(_obj!=null)
    {
    if(_obj.GetType().ToString()=="System.Web.UI.WebControls.TextBox")
    {
    string[] v_ls=_tb.Rows[0][i].ToString().Split(' ');
    ((System.Web.UI.WebControls.TextBox)_obj).Text=v_ls[0]; }
    if(_obj.GetType().ToString()=="System.Web.UI.WebControls.DropDownList")
    {
    //需要加如果未有对应项目的处理
    if(!_tmp.ddl_val(((System.Web.UI.WebControls.DropDownList)_obj),_tb.Rows[0][i].ToString()))
    {
      ((System.Web.UI.WebControls.DropDownList)_obj).Items.Insert(0,_tb.Rows[0][i].ToString());
    }
    }
    }
    } _tmp.Dispose();
    }
    /// <summary>
    /// 普遍数据
    /// </summary>
    /// <returns>SQL语句</returns>
    public string Update()
    {
    mysdd.db _tmp=new db();
    _tmp.showmsg(_moditype.ToString());
    if(_moditype==1)
    {
     
    return AddMode();
     
    }
    else
    {
       return UpdateMode();
    }

    }     /// <summary>
        /// 添加数据模式
        /// </summary>
        /// <returns>SQL语句</returns>
    public string AddMode()
    {
    string v_ls_field="";
    string v_ls_value="";
    string ls_field="p_number,";
    string ls_value="'"+_p_number+"',"; for(int i=0;i<g_ctl;i++)
    { object _obj=_table.FindControl(_ctl[i]);
    if(_obj!=null)
    { if(_obj.GetType().ToString()=="System.Web.UI.WebControls.DropDownList")
    {
    //需要加如果未有对应项目的处理
    //base.ddl_val(((System.Web.UI.WebControls.DropDownList)_obj),_tb.Rows[0][i].ToString());
    v_ls_value=((System.Web.UI.WebControls.DropDownList)_obj).SelectedValue.ToString();
    v_ls_field=((System.Web.UI.WebControls.DropDownList)_obj).ID.ToString();
    }
    else
    {
    v_ls_value=((System.Web.UI.WebControls.TextBox)_obj).Text;
    v_ls_field=((System.Web.UI.WebControls.TextBox)_obj).ID.ToString();
    }
    }  //处理字段
                    ls_field+=v_ls_field+",";
    if(_ctltype[i]=="C")
    {
    v_ls_value="'"+v_ls_value+"'"; 
    }
    else if(_ctltype[i]=="D")
    {
    v_ls_value="to_date('"+v_ls_value+"','yyyy-mm-dd')";    
    }

    ls_value+=v_ls_value+","; }
    mysdd.db _tmp=new db();
                _tmp.sql="insert into  aa01  ("+ls_field.Substring(0,ls_field.Length-1)+")   values ("+ls_value.Substring(0,ls_value.Length-1)+")";
    try
    {
      _tmp.runsql();
    }
    catch
    {
      _tmp.showmsg("人员基本信息添加失败,请检查数据输入是否正确!");
      return _tmp.sql;
    }
              _tmp.showmsg("人员基本信息添加成功!");  
    _tmp.Dispose();
    return _tmp.sql;
    } /// <summary>
    /// 更新模式数据
    /// </summary>
    /// <returns>SQL语句</returns>
    public string UpdateMode()
    {
    string v_sql="";
    string v_ls_field="";
    string v_ls_value=""; for(int i=0;i<g_ctl;i++)
    { object _obj=_table.FindControl(_ctl[i]);
    if(_obj!=null)
    { if(_obj.GetType().ToString()=="System.Web.UI.WebControls.DropDownList")
    {
    //需要加如果未有对应项目的处理
    // base.ddl_val(((System.Web.UI.WebControls.DropDownList)_obj),_tb.Rows[0][i].ToString());
    v_ls_value=((System.Web.UI.WebControls.DropDownList)_obj).SelectedValue.ToString();
    v_ls_field=((System.Web.UI.WebControls.DropDownList)_obj).ID.ToString();
    }
    else
    {
    v_ls_value=((System.Web.UI.WebControls.TextBox)_obj).Text;
    v_ls_field=((System.Web.UI.WebControls.TextBox)_obj).ID.ToString();
    }

    if(_ctltype[i]=="C")
    {
    v_sql=v_sql+v_ls_field+"='"+v_ls_value+"',"; 
    }
    else if(_ctltype[i]=="D")
    {
    v_sql=v_sql+v_ls_field+"=to_date('"+v_ls_value+"','yyyy-mm-dd'),";    
    }
    else
    {
    v_sql=v_sql+v_ls_field+"="+v_ls_value+",";  
    }
    }
    mysdd.db _tmp=new db();
    _tmp.sql="update aa01 set "+v_sql.Substring(0,v_sql.Length-1)+" where p_number='"+_p_number+"'";
    try
    {
    _tmp.runsql();
    }
    catch
    {
    _tmp.showmsg("人员基本信息更新失败,请检查数据输入是否正确!");
    return _tmp.sql;
    }
    _tmp.showmsg("人员基本信息更新成功!");  
    _tmp.Dispose();
    return _tmp.sql;
    }
    // public void SetModiType(int p_moditype)
    // {
    // //如果是-1即为添加模式 取新的p_number号
    // if(p_moditype==-1)
    // {
    //   mysdd.db _tmp=new db();
    //   DataTable _tb=_tmp.gettable("select S_AA01_P_NUMBER.nextval from dual");
    //   _tmp.Dispose();
    //   _p_number=_tb.Rows[0][0].ToString();
    // }
    // }
    /// <summary>
    /// 刷新照片
    /// </summary>
    public void RefreshPic()
    {
        object _obj=_table.FindControl("emppic");
    if(_obj!=null)
    {
    ((System.Web.UI.WebControls.Image)_obj).ImageUrl="../comm/updatepic.aspx?number="+_p_number;
    }
    }
    }
    }