SharePoint 2010 电子表单之重复表

一般来讲SharePoint的表单有三种方式

1. Infopath表单的对应特定的列表(直接在列表中可以自定义列表,只适用特定列表)

2. 复杂的表单,如需要重复表,且重复表的数据需用来统计

3. Infopath: 新建一个Infopath,然后通过发布,激活,适应多个列表。

下面是一个重复表的开发实例,如下图所示:

下面是开发这种表单的常用代码:

前台代码:

复制代码
          <div style="padding-top: 10px;">

                <asp:GridView ID="GridView1" AutoGenerateColumns="False" HeaderStyle-CssClass="GridHeader"
                    runat="server" RowStyle-CssClass="GridRow" Width="100%" onrowdatabound="GridView1_RowDataBound">
                    <Columns>
                        <asp:TemplateField HeaderText="请假类型">
                            <ItemTemplate>
                                <asp:Label ID="lbID" runat="server" Visible="false"  Text='<%# Eval("ID")%>'></asp:Label>
                                  <asp:CheckBox ID="CheckBox1" Visible="false" runat="server" Checked='<%#Eval("New") %>'/>
                                <asp:DropDownList ID="ddlQjlx" runat="server">
                                    <asp:ListItem>病假</asp:ListItem>
                                    <asp:ListItem>事假</asp:ListItem>
                                    <asp:ListItem>年假</asp:ListItem>
                                    <asp:ListItem>去年年假</asp:ListItem>
                                    <asp:ListItem>调休假</asp:ListItem>
                                    <asp:ListItem>去年调休假</asp:ListItem>
                                    <asp:ListItem>婚假</asp:ListItem>
                                    <asp:ListItem>丧假</asp:ListItem>
                                    <asp:ListItem>产假</asp:ListItem>
                                    <asp:ListItem>陪产假</asp:ListItem>
                                </asp:DropDownList>
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Center" />
                            <HeaderStyle HorizontalAlign="Center"/>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="开始时间">
                            <ItemTemplate>
                                <SharePoint:DateTimeControl ShowWeekNumber="true" HoursMode24="true" DateOnly="true"
                                    ID="dtStartTime" runat="server"></SharePoint:DateTimeControl>
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Center" Width="120" />
                            <HeaderStyle HorizontalAlign="Center" />
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="结束时间">
                            <ItemTemplate>
                                <SharePoint:DateTimeControl ShowWeekNumber="true" HoursMode24="true" DateOnly="true"
                                    ID="dtEndTime" runat="server"></SharePoint:DateTimeControl>
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Center" Width="120" />
                            <HeaderStyle HorizontalAlign="Center" />
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="备注">
                            <ItemTemplate>
                                <asp:TextBox ID="txtDemo" runat="server" Width="100%" Text='<%#Eval("Demo") %>'></asp:TextBox>
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Left" />
                            <HeaderStyle HorizontalAlign="Center"   Width="100%"/>
                        </asp:TemplateField>
                        <asp:TemplateField HeaderText="">
                            <ItemTemplate>
                                <asp:Button ID="btnDelete" Text="删除" CssClass="btn" runat="server" OnClientClick="return confirm('是否要删除?');"
                                    OnClick="btnDelete_Click"  />
                            </ItemTemplate>
                            <ItemStyle HorizontalAlign="Center" />
                            <HeaderStyle HorizontalAlign="Center" Width="100" />
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </div>
                    <div style="padding-bottom: 6px; text-align:left; display:block; 100%; padding-top:6px;">
            <asp:Button ID="btnAdd" runat="server" Text="增加" CssClass="btn1" OnClick="btnAdd_Click"/></div>
复制代码

会用到的后台代码:

PageLoad最重要的业务逻辑

复制代码
protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            string sID = Request["ID"];
            if (!string.IsNullOrEmpty(Request["action"]) && Request["action"].ToString().Equals("select"))
            {
                //这是视图,IFrame模式
                txtBumen.Enabled = false;
                txtZhiwei.Enabled = false;
                btnAdd.Visible = false;
                btnClose.Visible = false;
                btnSave.Visible = false;
                //Response.Write("false");
            }
            if (string.IsNullOrEmpty(sID))
            {
                //新建模式
                ViewState["Title"] = GetSequenceCode("QJ");
                //Response.Write(ViewState["Title"].ToString());
                this.txtXingmin.Text = SPContext.Current.Web.CurrentUser.Name;
                //从人员信息列表去当前用户数据
                SPListItem item = GetSingleItemFromPeopleInfo(SPContext.Current.Web.CurrentUser.LoginName);
                if (item != null)
                {
                    txtBumen.Text = ConvertObject(item["类别/部门"]);
                    txtZhiwei.Text = ConvertObject(item["职位"]);
                }
                LoadData();
            }
            else
            {
                //编辑模式
                ViewState["ID"] = sID;
                //读取数据
                BindExistngData(sID);
            }

            LoadCalculateData();
        }
    }
复制代码

PageLoad首次加载需绑定一行数据,当New字段为True时,表示其为新的数据,如果为fasle时,当点击删除的时候需把列表的数据也一齐删掉

复制代码
    //初始化DataTable结构
    private DataTable InitializeDataTableStructure()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(string));
        dt.Columns.Add("Type", typeof(string));
        dt.Columns.Add("BeginTime", typeof(DateTime));
        dt.Columns.Add("EndTime", typeof(DateTime));
        dt.Columns.Add("Demo", typeof(string));
        dt.Columns.Add("New", typeof(bool));
        return dt;
    }

    //新建数据初始化数据,绑带GridView一行空的数据
    private void LoadData()
    {
        DataTable dt = InitializeDataTableStructure();
        DataRow dr = dt.NewRow();
        dr["ID"] = 1;
        dr["New"] = true;
        dt.Rows.Add(dr);
        ViewState["_DT"] = dt;
        this.GridView1.DataSource = dt;
        this.GridView1.DataBind();
    }
复制代码

遍历GridView行生成DataTable

复制代码
    //遍历GridView填写的数据
    protected DataTable GetDataSource()
    {
        DataTable dt = ((DataTable)ViewState["_DT"]).Clone();
        GridViewRowCollection Rows = this.GridView1.Rows;
        if (Rows != null && Rows.Count > 0)
        {
            foreach (GridViewRow gvr in Rows)
            {
                Label lbID = gvr.FindControl("lbID") as Label;
                CheckBox cbNew = gvr.FindControl("CheckBox1") as CheckBox;
                DropDownList ddlQjlx = gvr.FindControl("ddlQjlx") as DropDownList;
                DateTimeControl dtBeginTime = gvr.FindControl("dtStartTime") as DateTimeControl;
                DateTimeControl dtEndTIme = gvr.FindControl("dtEndTime") as DateTimeControl;
                TextBox txtDemo = gvr.FindControl("txtDemo") as TextBox;
                DataRow dr = dt.NewRow();
                dr["ID"] = lbID.Text;
                dr["New"] = cbNew.Checked;
                dr["Type"] = ddlQjlx.SelectedValue;
                if (!dtBeginTime.IsDateEmpty)
                {
                    dr["BeginTime"] = dtBeginTime.SelectedDate;
                }
                if (!dtEndTIme.IsDateEmpty)
                {
                    dr["EndTime"] = dtEndTIme.SelectedDate;
                }
                dr["Demo"] = txtDemo.Text;
                dt.Rows.Add(dr);
            }
        }
        ViewState["_DT"] = dt;
        return dt;
    }
复制代码

GridView可删除的功能

复制代码
    //删除GridView选中行的数据
    protected void btnDelete_Click(object sender, EventArgs e)
    {
        Label LabelID = ((Label)((sender as Button).Parent.Parent as GridViewRow).FindControl("lbID"));
        DataTable dt = GetDataSource();
        DataRow[] drs = dt.Select("ID='" + LabelID.Text + "'");
        bool bIsNew = Convert.ToBoolean(drs[0]["New"].ToString());
        dt.Rows.Remove(drs[0]);
        if (!bIsNew)
        {
            //不是新的数据,把请假单次表的数据也要删掉
            DeleteItemFromCiBiaoByID(LabelID.Text);
        }
        if (dt == null || dt.Rows.Count == 0)
        {
            LoadData();
            dt = (DataTable)ViewState["_DT"];
        }
        ViewState["_DT"] = dt;
        this.GridView1.DataSource = dt;
        this.GridView1.DataBind();
    }
复制代码

GridView行数据绑定代码

复制代码
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        DataTable dt = (DataTable)ViewState["_DT"];
        //Response.Write(bv.ToString());
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // if (e.Row.RowState == DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate)
            Label lbID = (Label)e.Row.FindControl("lbID");
            DropDownList ddlQjlx = e.Row.FindControl("ddlQjlx") as DropDownList;
            ddlQjlx.Enabled = btnSave.Visible;
            DateTimeControl dtBeginTime = e.Row.FindControl("dtStartTime") as DateTimeControl;
            dtBeginTime.Enabled = btnSave.Visible;
            DateTimeControl dtEndTime = e.Row.FindControl("dtEndTime") as DateTimeControl;
            dtEndTime.Enabled = btnSave.Visible;
            TextBox txtDemo = e.Row.FindControl("txtDemo") as TextBox;
            txtDemo.Enabled = btnSave.Visible;
            Button btnDelete = e.Row.FindControl("btnDelete") as Button;
            btnDelete.Visible = btnSave.Visible;
            //btnDelete.Visible = bv;
            DataRow[] drs = dt.Select("ID='" + lbID.Text + "'");
            if (!string.IsNullOrEmpty(ConvertObject(drs[0]["BeginTime"])))
            {
                dtBeginTime.SelectedDate = Convert.ToDateTime(drs[0]["BeginTime"].ToString());
            }
            if (!string.IsNullOrEmpty(ConvertObject(drs[0]["EndTime"])))
            {
                dtEndTime.SelectedDate = Convert.ToDateTime(drs[0]["EndTime"].ToString());
            }

            if (!string.IsNullOrEmpty(ConvertObject(drs[0]["Type"])))
            {
                ddlQjlx.SelectedValue = ConvertObject(drs[0]["Type"]);
            }
        }
    }
复制代码

 保存按钮代码:

复制代码
        SPWeb web = SPContext.Current.Web;
        SPList mainlist = web.Lists["请假单主表"];
        SPList cilist = web.Lists["请假单次表"];

        web.AllowUnsafeUpdates = true;
        string sMainItemID = string.Empty;

        if (ViewState["ID"] != null)
        {
            //旧的数据,要修改
            string sID = ViewState["ID"].ToString();
            SPListItem item = mainlist.GetItemById(Convert.ToInt32(sID));
            item["姓名"] = txtXingmin.Text.Trim();
            item["部门"] = txtBumen.Text.Trim();
            item["职位"] = txtZhiwei.Text.Trim();

            item.SystemUpdate();
            sMainItemID = item.ID.ToString();
        }
        else
        {
            SPListItem mainNewItem = mainlist.Items.Add();
            mainNewItem["Title"] = ViewState["Title"].ToString();
            mainNewItem["LoginName"] = SPContext.Current.Web.CurrentUser.LoginName;
            mainNewItem["姓名"] = txtXingmin.Text.Trim();
            mainNewItem["部门"] = txtBumen.Text.Trim();
            mainNewItem["职位"] = txtZhiwei.Text.Trim();
            mainNewItem.Update();
            sMainItemID = mainNewItem.ID.ToString();
        }
        if (dt != null & dt.Rows.Count > 0)
        {
            foreach (DataRow rdr in dt.Rows)
            {
                if (Convert.ToBoolean(rdr["New"].ToString()))
                {
                    SPListItem oNewItem = cilist.Items.Add();
                    oNewItem["请假单类型"] = ConvertObject(rdr["Type"]);
                    oNewItem["开始时间"] = Convert.ToDateTime(rdr["BeginTime"].ToString()).ToString("yyyy-MM-dd");
                    oNewItem["结束时间"] = Convert.ToDateTime(rdr["EndTIme"].ToString()).ToString("yyyy-MM-dd");
                    oNewItem["备注"] = ConvertObject(rdr["Demo"]);
                    oNewItem["ParentID"] = sMainItemID;
                    oNewItem.Update();
                }
                else
                {
                    SPListItem oCurrentItem = cilist.GetItemById(Convert.ToInt32(rdr["ID"].ToString()));
                    oCurrentItem["请假单类型"] = ConvertObject(rdr["Type"]);
                    oCurrentItem["开始时间"] = Convert.ToDateTime(rdr["BeginTime"].ToString()).ToString("yyyy-MM-dd");
                    oCurrentItem["结束时间"] = Convert.ToDateTime(rdr["EndTIme"].ToString()).ToString("yyyy-MM-dd");
                    oCurrentItem["备注"] = ConvertObject(rdr["Demo"]);
                    oCurrentItem.SystemUpdate();
                }
            }
        }
复制代码
原文地址:https://www.cnblogs.com/ningang/p/4321790.html