数据库的列是不确定的,表不同列也不同,如何实现,动态的设置某些列可编辑?谢谢了

解决方案 »

  1.   

    用SQLDATASOURSE做数据源,然后GRIDVIEW自动生成列不就可以了啊
      

  2.   

    daybreakken 自动生成列可以,可是都是只读的,根据需要改属性变成可编辑的。
    Eddie005 多个报表如果一个一个设置太麻烦了,该如何实现呢?谢谢帮忙,太感谢了,可以加分。
      

  3.   


        Protected Sub bindAssessmentGrid(ByVal mode As ListItemType)        Dim selectColumn As New DataColumn
            Dim _dimensionId As Integer        _dtDimensionAssessment = _objAssessmentBLL.GetYearLevelAssessment(Me.ucAppPageHeader.YearSemesterId, _
            Me.ucAppPageHeader.HomeGroupId, Me.ucAppPageHeader.DomainId, _
            Me.ucAppPageHeader.AssessorId, Me.ucAppPageHeader.YearLevelId)        'If there are no records for students hide the Assessment panel and exit sub
            If _dtDimensionAssessment.Rows.Count = 0 Then
                Me.AssessmentPanel.Visible = False
                Exit Sub
            Else
                Me.AssessmentPanel.Visible = True
            End If
            If mode = ListItemType.Item Then            'Clears all columns from grid only for Item mode
                gvDimensionAssessment.Columns.Clear()            'Adds a select checkbox to the datatable, sets it's caption,
                'and ordinal position to first in the grid but only in item template
                selectColumn = New DataColumn
                selectColumn.Caption = "Select"
                selectColumn.ColumnName = "Select"
                _dtDimensionAssessment.Columns.Add(selectColumn)
                selectColumn.SetOrdinal(0)
            End If
            'Adds in the template column controls
            For Each _dCol In _dtDimensionAssessment.Columns
                Dim tf As New TemplateField            'Puts all fields into template except StudentId and any AchievementId fields            If Left(_dCol.ColumnName, 5) <> "AchId" Then                If _dCol.ColumnName = "Student" Then
                        tf.ItemStyle.HorizontalAlign = HorizontalAlign.Left
                    End If                If InStr(_dCol.ColumnName, "_") <> 0 Then
                        _dimensionId = CInt(Left(_dCol.ColumnName, InStr(_dCol.ColumnName, "_") - 1))
                        _dCol.ColumnName = Mid(_dCol.ColumnName, InStr(_dCol.ColumnName, "_") + 1)
                    End If                tf.ItemTemplate = New GridviewDimensionTemplate(ListItemType.Item, _
                    _dCol.ColumnName, _dCol.Caption, _dimensionId)                If _dCol.ColumnName <> "StudentId" Then
                        tf.EditItemTemplate = New GridviewDimensionTemplate(ListItemType.EditItem, _
                        _dCol.ColumnName, _dCol.Caption, _dimensionId)
                    End If                tf.HeaderTemplate = New GridviewDimensionTemplate(ListItemType.Header, _
                    _dCol.ColumnName, _dCol.Caption, _dimensionId)                If _dCol.ColumnName = "StudentId" Then tf.Visible = False
                    gvDimensionAssessment.Columns.Add(tf)
                End If
            Next        'Add Edit, update, Cancel command fields after all template
            'fields are bound
            If mode = ListItemType.Item Then            Dim cmdEdit As New ButtonField
                cmdEdit.ButtonType = ButtonType.Image
                gvDimensionAssessment.Columns.Add(cmdEdit)            'Enable global selectors as they may have been disabled after an edit mode call
                Me.DimensionsDropDownList.Enabled = True
                Me.cmdApply.Enabled = True
                Me.VELSScoreDropDownList.Enabled = True        ElseIf mode = ListItemType.EditItem Then            Dim cmdUpdate As New ButtonField
                cmdUpdate.ButtonType = ButtonType.Image
                gvDimensionAssessment.Columns.Add(cmdUpdate)            Dim cmdCancel As New ButtonField
                cmdCancel.ButtonType = ButtonType.Image
                gvDimensionAssessment.Columns.Add(cmdCancel)            'Disable global selectors as they are not required in edit mode
                Me.DimensionsDropDownList.Enabled = False
                Me.cmdApply.Enabled = False
                Me.VELSScoreDropDownList.Enabled = False
            End If
            'bind and display the data
            gvDimensionAssessment.DataSource = _dtDimensionAssessment
            gvDimensionAssessment.DataBind()    End Sub
      

  4.   

    动态DataSet 实现,行列不固定,例子要示情况而言
      

  5.   

    .......不是自动生成列的问题啊,动态dateset,本来dateset就是动态的,我是一只紧张的小星星^_^你的代码是添加了动态模板列吧,但是不是只有一个列需要编辑阿.
    说清楚点吧
    数据取出来帮定到gridview是这样a b c d e f g h i j k假定 b d  f h j 需要可以编辑,而另外的业务的表数据取出来是
     1 2 3 4 5 6 7 8 9 10 11其中 5 7 9 11需要可以编辑
    假如列数比较多,难道必须一个一个模版列去定义?而且写死了模版列多个业务就要用多个控件,业务多的话很不好用阿
      

  6.   

    关注,我想到了一个方案,但是可能不是很好,所以没有提出来,还有你这种方式,用Datalist Repeater 比较好吧,别用Gridview了。
      

  7.   

    那试下手写的TABLE
    NEW一个TABLE
                    TableRow row = new TableRow();
                    Table1.Rows.Add(row);
                    TableCell column0 = new TableCell();
                    row.Cells.Add(column0);
                    column0.Text = Request.QueryString["initial"];
                    TableCell column1 = new TableCell();
                    row.Cells.Add(column1);
                    column1.Text = string.Empty;
                    for (int j = 0; j < ds.Tables[0].Rows.Count; j++)
                    {
                        if (ds.Tables[0].Rows[j]["initial"].ToString() == column0.Text.ToString())
                        {
                            LinkButton lbt = new LinkButton();
                            column1.Controls.Add(lbt);
                            lbt.Font.Underline = false;
                        }
                    }
    这样就可以拉,动态的行动态的列而且可以触发事件,条件可以自己改下,我说的是思路
      

  8.   

    net_boy ,我看了你说的Datalist   Repeater   ,它们也是通过在页面脚本上设置模版列来实现的,您有什么好方法吗?
      

  9.   


        protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
           if (e.Row.RowType ==DataControlRowType.DataRow||e.Row.RowType==DataControlRowType.Header)
            {
                    for (int i = 0; i < e.Row.Cells.Count; i++)
                    {
                        //设置前两列不可选
                        if (i == 1 || i == 0)                    
                        { 
                            e.Row.Cells[i].Enabled = false;
                        }
                    }
            }
            
        }