这么一个功能:
1.订单表:
2.订单明细表:
其中订单明细表包含订单明细附件。
所以拟出
3.订单明细附件表
现要在VS2003中实现,
在订单明细的DataGrid(gridMain)中嵌套明细附件DataGrid(gridDetail)
其中gridMain中一模板列中嵌套DataGrid(gridDetail),其下放一Input,及一按钮用于上传附件,并绑定附件列表到gridDetail<input type="file" runat="server" id="inputFile" size="15">
<asp:Button CommandName="UPFILE" Runat="server" ID="btnUpFile" Text="上传" Width="40px" CausesValidation="false"></asp:Button>现在问题来了。
1.当我上传附件的时候,如何给gridDetail绑定因为取gridDetail.DataSource是null值。
2.在我保存订单时,理应先插订单表产生ID,再保存订单明细表,最后保存各明细的附件记录。请教应该如何做?
我的想法是
先保存订单,产生了ID后,遍历gridMain各行插入订单明细(取得明细ID),在插入订单明细时,再遍历gridDetail各行,插入明细附件记录。然后,取gridDetail的DataSource是null...
请教各位高手,有何高招?
另:项目较为紧急如有代码贴出,不甚感激。

解决方案 »

  1.   

    你真是遇到麻烦了,在 VS2003中使用 nested datagrid是相当的啰嗦,VS2003的名声不好的很大原因之一就是因为这个datagrid,以致于后来的VS2005及更高版本就不再叫datagrid,改成了GridView。我经常使用nested GridView,遗憾的是GridView与DataGrid有大多不同,帮你顶一下吧。
      

  2.   


    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><<html xmlns="http://www.w3.org/1999/xhtml" >  
    <head runat="server">  
        <title>DataListNesting</title>  
    </head>  
    <body>  
    <form id="form1" runat="server"> 
    <div>  
        <asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList1_ItemDataBound" DataSourceID="SqlDataSource1">  
            <ItemTemplate>  
            <asp:Label ID="Label1" runat="server" Text='<%# Eval("OrderID") %>'></asp:Label>  
            <asp:Label ID="Label2" runat="server" Text='<%# Eval("CustomerID") %>'></asp:Label>  
            <asp:DataList ID="DataList2" runat="server" DataSourceID="SqlDataSource2">  
                <ItemTemplate>  
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("ProductID") %>'></asp:Label>  
                    <asp:Label ID="Label2" runat="server" Text='<%# Eval("UnitPrice") %>'></asp:Label>  
                    <asp:Label ID="Label3" runat="server" Text='<%# Eval("Quantity") %>'></asp:Label>  
                </ItemTemplate>  
            </asp:DataList>  
            <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="server=.;database=Northwind;uid=sa;pwd=sa"  ProviderName="System.Data.SqlClient" SelectCommand="select ProductID, UnitPrice, Quantity from [Order Details] where orderID = @orderID">  
                <SelectParameters>  
                    <asp:Parameter Name="orderID" />  
                </SelectParameters>  
            </asp:SqlDataSource>  
        </ItemTemplate>  
        </asp:DataList>  
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="server=.;database=Northwind;uid=sa;pwd=sa" ProviderName="System.Data.SqlClient" SelectCommand="select OrderID, CustomerID from Orders"></asp:SqlDataSource>  
    </div>  
    </form>  
    </body>  
    </html>  
      

  3.   


    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {    }
    protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)   
        {   
            SqlDataSource sqlDataSource2;   
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)   
            {   
                sqlDataSource2 = e.Item.FindControl("SqlDataSource2") as SqlDataSource;   
                if (sqlDataSource2 != null)   
                {   
                    sqlDataSource2.SelectParameters["orderID"].DefaultValue = (e.Item.DataItem as DataRowView)["orderID"].ToString();   
                }   
            }   
        }   
    }  
     
     
      

  4.   

    1.当我上传附件的时候,如何给gridDetail绑定因为取gridDetail.DataSource是null值。
    ==
    上传附件后重新绑定gridMain那么gridDetail自然会绑定,绑定内部gridDetail的方法可以参考下面的案例(http://blog.csdn.net/amandag/archive/2008/06/11/2537344.aspx 案例是DataList的,但思想一样)
    2.在我保存订单时,理应先插订单表产生ID,再保存订单明细表,最后保存各明细的附件记录。请教应该如何做?
    ==
    使用事务,先插入从表再插入主表
      

  5.   

    模板列
    <EditItemTemplate> 
    <INPUT   id= "File1 "   type= "file "   name= "File1 "   runat= "server "> 
    </EditItemTemplate> 
    遍历取值System.Web.UI.HtmlControls.HtmlInputFile   tmp   =   e.Item.Cells[i].FindControl( "File1 ")   as   System.Web.UI.HtmlControls.HtmlInputFile; 
    string   filePath   =   tmp.PostedFile.FileName;
      

  6.   

    感谢各位的回答,
    上面各位首先都是说到了子DataGrid数据源绑定的解决方法,这个其实没有多大问题,
    在ItemDataBound事件里,可以处理,
    但是关键是上传附件时,如何将这个附件的DataTable保存住?
    因为这时候数据还没插入到数据库中,再新增一附件时,如何取到?难道用动态变量的ViewState来保存?