为了能动态地为datagrid 添加行,并可修改已添加的行我使用datagrid的模板列,每一列都是用textbox,可是最后我用For Each gridrow As DataGridItem In DataGrid1.Items  '确信是数据项而不是页首或页尾
  If gridrow.ItemType = ListItemType.Item Or              gridrow.ItemType=ListItemType.AlternatingItem Then
        dim sh as string =CType(gridrow.FindControl("Txb_sh"), TextBox).Text
            .....
  End If
Next
问题1: CType(gridrow.FindControl("Txb_sh"), TextBox).Text的值却为""(我已经在textbox中添加了值)为了保存dataset的状态,我是用了viewstate("data")=dataset1问题1: 可是在添加行之后,在textbox中输入内容,在添加行,却会将已添加行中输入的内容清空了

解决方案 »

  1.   

    取值不应该是: If gridrow.ItemType = ListItemType.Item Or              gridrow.ItemType=ListItemType.AlternatingItem 应该是编辑列:
    If gridrow.ItemType = ListItemType.EditItem
      

  2.   

    For Each gridrow As DataGridItem In DataGrid1.Items
      If gridrow.ItemType = ListItemType.EditItem Then
            dim sh as string = CType(gridrow.FindControl("Txb_sh"), TextBox).Text
      End If
    Next
      

  3.   

    gridrow.ItemType = ListItemType.EditItem 
    这个地方改了就错了。我想我还是把我的思路给大家说一下吧
    datagrid 里面的列是模板列,除了最后的控制列是删除按钮外,其它均为textbox,为的是能够修改而不是用datagrid提供的编辑按钮功能。
    然后在datagrid的外面放了两个按钮添加和保存,还有一个textbox是用来输入要增加的行数的。
    添加按钮的功能是能够增加规定行数的行,并且是能够多次添加,即第一次课添加2行,第二次课在上一次的基础上再增加3行,这样就有了5行记录。
    保存的时候从datagrid中循环从每一行取出数据可放入dataset后再操作,方法即使上面的从datagrid的每一行的模板列取数据CType(gridrow.FindControl("Txb_sh"), TextBox).Text;至于gridrow.ItemType = ListItemType.Item 是判断该row是否为datagrid里的行,不一定是编辑行。现在的问题就是:CType(gridrow.FindControl("Txb_sh"), TextBox).Text取出的数据是中为""
      

  4.   

    检查一下在取值之前是否重新绑定了DataGrid,要在
    if(!IsPostBack)
    {
        //这里绑定DataGrid才对
    }
      

  5.   

    绑定了,绑定了一个空的数据集
    datagrid1.datasource=dataset1
    datagrid1.databind()这个数据集是由一个adapter生成的,后来我为了使页面初始时能显示无数据的datagrid,将adapter.fill(dataset1),去掉了
      

  6.   

    不管是绑定空数据集也好还是有数据,绑定操作都要写在If Not IsPostBack里面,如下所示
    Sub Page_Load
        If Not IsPostBack
            datagrid1.datasource=dataset1
            datagrid1.databind()
        End If
    End Sub
      

  7.   

    我这里网速太慢,不能及时把信息写上来,不好意思了。
    是的,我是这样写的,但是我再调成的时候发现了一个很奇怪的现象,就是在执行完添加按钮的事件之后
    (譬如添加行数为2),会执行saveViewState()这个重载的函数,而执行完他之后,有进入page_load里面执
    行并且此时ispostback=false(这里很奇怪),之后bddsm_dataset里面的表bddsm的rows=0,之后又执行saveViewState()
    使ViewState("Data")中的dataset中的表bddsm的rows=0,这样本次添加结束;可我在继续执行添加先执行
    LoadViewState(ByVal savedState As Object),取出视图中的dataset,这时bddsm_dataset里面的表bddsm
    的rows竟然 又等于2了?????????
      

  8.   

    我还是把整个后台程序写出来吧,大家帮我分析一下
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.OleDbConnection1 = New System.Data.OleDb.OleDbConnection
            Me.OleDbCommand1 = New System.Data.OleDb.OleDbCommand
            Me.OleDbDataAdapter1 = New System.Data.OleDb.OleDbDataAdapter
            Me.Bddsm_dataset1 = New jsjxlibrary.bddsm_dataset
            CType(Me.Bddsm_dataset1, System.ComponentModel.ISupportInitialize).BeginInit()
            '
            'OleDbDataAdapter1
            '
            Me.OleDbDataAdapter1.DeleteCommand = Me.OleDbCommand1
            Me.OleDbDataAdapter1.InsertCommand = Me.OleDbCommand1
            Me.OleDbDataAdapter1.SelectCommand = Me.OleDbCommand1
            Me.OleDbDataAdapter1.UpdateCommand = Me.OleDbCommand1
            '
            'Bddsm_dataset1
            '
            Me.Bddsm_dataset1.DataSetName = "bddsm_dataset"
            Me.Bddsm_dataset1.Locale = New System.Globalization.CultureInfo("zh-CN")
            CType(Me.Bddsm_dataset1, System.ComponentModel.ISupportInitialize).EndInit()    End Sub
    Protected Overrides Sub LoadViewState(ByVal savedState As Object)        MyBase.LoadViewState(savedState)
            '取得编辑前的DataSet的视图状态
            If Not ViewState("Data") Is Nothing Then            Bddsm_dataset1 = CType(ViewState("Data"), DataSet)
            End If        If Not ViewState("LastEditedPage") Is Nothing Then            '取得视图状态中保存的当前页的索引
                lastEditedPage = CInt(ViewState("LastEditedPage"))
            End If
        End Sub
        Protected Overrides Function SaveViewState() As Object
            '保存当前DataSet的视图状态
            ViewState("Data") = Bddsm_dataset1
            '保存当前页面索引的视图状态
            ViewState("LastEditedPage") = lastEditedPage
            Return (MyBase.SaveViewState())
        End Function    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'OleDbConnection1
            '
            '添入连接
            Me.OleDbConnection1.ConnectionString = ConfigurationSettings.AppSettings("ConnectionString")
            '首次加载信息
            If Not IsPostBack Then
                Try
                    'Me.loaddataset()
                    DataGrid1.DataSource = Me.Bddsm_dataset1.Tables("bddsm")
                    DataGrid1.DataBind()
                Catch eload As Exception
                    Me.Response.Write(eload.Message)
                End Try
            End If
        End Sub    Private Sub btn_查看建议_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_查看建议.Click
            Me.Response.Redirect("查看用户建议购买.aspx")
        End Sub    Private Sub btn_保存报订单_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_保存报订单.Click
            '循环取得DataGrid控件中的项,并把每项的数据保存到DataSet中
            For Each gridrow As DataGridItem In DataGrid1.Items            '确信是数据项而不是页首或页尾
                If gridrow.ItemType = ListItemType.Item Or gridrow.ItemType = ListItemType.AlternatingItem Then                '建立DataSet中testTable表的新行
                    Dim row As DataRow = Me.Bddsm_dataset1.Tables("bddsm").NewRow
                    '针对绑定数据源的数据项索引建立数据行的索引
                    row = Me.Bddsm_dataset1.Tables("bddsm").Rows(gridrow.DataSetIndex)
                    '取得当前行文本框中的数据值,添加到DataSet中testTable表
                    row("bddbh") = "jjj" 'Trim(Me.txb_报订单号.Text)
                    row("sh") = CType(gridrow.FindControl("Txb_sh"), TextBox).Text
                    row("sm") = CType(gridrow.FindControl("Txb_mc"), TextBox).Text
                    row("bb") = CType(gridrow.FindControl("Txb_bb"), TextBox).Text
                    row("dj") = CDbl(Trim(CType(gridrow.FindControl("Txb_dj"), TextBox).Text))
                    row("dgsl") = CInt(Trim(CType(gridrow.FindControl("Txb_dgsl"), TextBox).Text))
                End If
            Next
        End Sub    Private Sub DataGrid1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DataGrid1.ItemCommand        '删除 
            If e.CommandName = "Delete" Then
                '移除当前绑定的数据表中的指定行
                Bddsm_dataset1.Tables("bddsm").Rows.Remove(Bddsm_dataset1.Tables("bddsm").Rows(e.Item.DataSetIndex))
                '防止最后页删除唯一的一条记录时出现异常信息
                If DataGrid1.PageCount - DataGrid1.CurrentPageIndex = 1 And DataGrid1.Items.Count = 1 Then                If DataGrid1.PageCount > 1 Then                    lastEditedPage = lastEditedPage - 1                Else                    lastEditedPage = 0
                    End If
                End If
                DataGrid1.CurrentPageIndex = lastEditedPage
                BindGrid()
            End If
        End Sub    Private Sub BindGrid()        DataGrid1.DataSource = Me.Bddsm_dataset1.Tables("bddsm")
            DataGrid1.DataBind()
            lastEditedPage = DataGrid1.CurrentPageIndex    End Sub
        Private Sub btn_增加_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_增加.Click        '如果输入了添加的行数
            If Not Me.txb_增加行数.Text Is nothing Then
                Try
                    '获取要增加的行数
                    Dim addRows As Integer = CInt(Me.txb_增加行数.Text)
                    Dim i As Integer
                    For i = 1 To addRows                    '为当前绑定的数据表添加新行
                        Dim row As DataRow = Bddsm_dataset1.Tables("bddsm").NewRow
                        row(0) = "" 'Trim(Me.txb_报订单号.Text)
                        row(1) = ""
                        row(2) = ""
                        row(3) = ""
                        row(4) = "0.0"
                        row(5) = "0"
                        Bddsm_dataset1.Tables("bddsm").Rows.Add(row)
                    Next
                Catch ex As Exception
                    Response.Write(ex.Message)
                End Try
            End If
            '重新进行数据绑定
            BindGrid()
        End Sub
        Public Sub DataGrid1_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid1.PageIndexChanged
            DataGrid1.CurrentPageIndex = e.NewPageIndex
            BindGrid()
        End Sub
      

  9.   

    前台datagrid:
    <asp:datagrid id="DataGrid1" runat="server" Width="581px" AllowPaging="True" PageSize="11" AutoGenerateColumns="False" DataKeyField="sh" DataMember="bddsm" DataSource="<%# bddsm_dataset1 %>">
    <HeaderStyle Font-Names="宋体" Font-Bold="True" HorizontalAlign="Center" ForeColor="#990033" VerticalAlign="Middle"BackColor="#6699FF"></HeaderStyle>
    <Columns>
    <asp:TemplateColumn Visible="False" HeaderText="报订单编号">
    <ItemTemplate>
    <asp:TextBox id="Txb_bddbh" runat="server" Width="70px" Text='<%# DataBinder.Eval(Container, "DataItem.bddbh") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="书号">
    <ItemTemplate>
    <asp:TextBox id="Txb_sh" runat="server" Width="70px" Text='<%# DataBinder.Eval(Container, "DataItem.sh") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="书名">
    <ItemTemplate>
    <asp:TextBox id="Txb_mc" runat="server" Width="190px" Text='<%# DataBinder.Eval(Container, "DataItem.sm") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="出版社">
    <ItemTemplate>
    <asp:TextBox id="Txb_bb" runat="server" Width="190px" Text='<%# DataBinder.Eval(Container, "DataItem.bb") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="订价">
    <ItemTemplate>
    <asp:TextBox id="Txb_dj" runat="server" Width="50px" Text='<%# DataBinder.Eval(Container, "DataItem.dj") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="定购数量">
    <ItemTemplate>
    <asp:TextBox id="Txb_dgsl" runat="server" Width="40px" Text='<%# DataBinder.Eval(Container, "DataItem.dgsl") %>'>
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="控制">
    <ItemTemplate>
    <asp:linkButton id="lbtn_删除" runat="server" Width="35px" Text="删除" CommandName="Delete"></asp:linkButton>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    <PagerStyle NextPageText="Next" PrevPageText="Previous" HorizontalAlign="Left" Mode="NumericPages"></PagerStyle>
    </asp:datagrid>开来救火阿