承接MOSS各种工作流开发 联系人:王先生.电话:13691349686 QQ:252385878 MSN:wanghao-3@hotmail.com

寻找网络安全产品代理商(主要产品有:主机审计与监控系统,移动介质管理系统,文件集中管理安全存储系统,硬盘锁等)主要针对内网安全和数据防泄密 联系人:张小姐 电话:13522877350 QQ:419919940

2008年5月15日 #

列表查询WebPart

SmartListSearchWebPart
简单列表查询WebPart.本代码只是一个简单的Demo,代码没有实际的价值,但是很有学习价值.
在项目中可以得到很好的应用!


输入key





Code :

using System;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Xml;

using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace SmartListSearchWebPart
{
    [Guid("34903418-36da-45cb-ae81-27cd82b628dd")]
    public class SmartListSearchWebPart : System.Web.UI.WebControls.WebParts.WebPart
    {
        public SmartListSearchWebPart()
        {
            this.ExportMode = WebPartExportMode.All;
        }

        private Button btnSearch;
        private TextBox tbKey;
        /// <summary>
        /// create child controls
        /// </summary>
        protected override void CreateChildControls()
        {
            btnSearch = new Button();
            btnSearch.Text = "查询";
            btnSearch.Click += new EventHandler(btnSearch_Click);
            this.Controls.Add(btnSearch);

            tbKey = new TextBox();
            this.Controls.Add(tbKey);

            base.CreateChildControls();
        }

        private SPList List
        {
            get
            {
                return SPContext.Current.List;
            }
        }
        /// <summary>
        /// search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btnSearch_Click(object sender, EventArgs e)
        {
  
            if (this.tbKey.Text != "")
            {
                string cmal = string.Format("<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>{0}</Value></Contains></Where>", this.tbKey.Text.ToString());
                this.SetCurrentListViewSchemaQuery(cmal);
            }
           

        }
        /// <summary>
        /// set current list view schema query
        /// </summary>
        /// <param name="cmal"></param>
        private void SetCurrentListViewSchemaQuery(string cmal)
        {
            if (!string.IsNullOrEmpty(cmal))
            {
                string str = "{" +this.List.ID.ToString() +"}";

               
                foreach (System.Web.UI.WebControls.WebParts.WebPart webPart in base.Zone.WebParts)
                {
                    if (webPart is ListViewWebPart)
                    {
                        ListViewWebPart listViewWebPart = (ListViewWebPart)webPart;
                        if (string.Compare(listViewWebPart.ListName, str, true) != 0)
                        {
                            continue;
                        }

                        if (string.IsNullOrEmpty(cmal))
                        {
                            listViewWebPart.ListViewXml = this.List.Views[new Guid(listViewWebPart.ViewGuid)].HtmlSchemaXml;

                        }
                        else
                        {
                            XmlDocument xmlDocument = new XmlDocument();
                            xmlDocument.LoadXml(listViewWebPart.ListViewXml);
                            this.ChangeSchemaXmlCaml(xmlDocument, cmal);
                            listViewWebPart.ListViewXml = xmlDocument.InnerXml;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// move where
        /// </summary>
        /// <param name="q"></param>
        /// <returns></returns>
        private string GetInnerQuery(string q)
        {
            XmlDocument docuemnt = new XmlDocument();
            docuemnt.LoadXml(q);
            return docuemnt.DocumentElement.InnerXml;
        }
        /// <summary>
        /// change schema xml query
        /// </summary>
        /// <param name="xmlDocument"></param>
        /// <param name="query"></param>
        private void ChangeSchemaXmlCaml(XmlDocument xmlDocument,string query)
        {
            if (!string.IsNullOrEmpty(query))
            {
                string innerXml = this.GetInnerQuery(query);
                if (innerXml != "")
                {
                    XmlNode node = xmlDocument.DocumentElement.SelectSingleNode("Query");
                    XmlNode oldChild = node.SelectSingleNode("Where");

                    if (oldChild != null)
                    {
                        node.RemoveChild(oldChild);
                    }

                    XmlNode newChild = xmlDocument.CreateElement("Where");
                    newChild.InnerXml = innerXml;
                    node.AppendChild(newChild);
                    xmlDocument.DocumentElement.SelectSingleNode("ViewEmpty").InnerXml = "<HTML><![CDATA[<font color='red'><b>AA Say:未找到符合查询条件的记录。</b></font>]]></HTML>";
                }

            }
        }
        /// <summary>
        /// render
        /// </summary>
        /// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {
            writer.Write("<table><tr><td>");
            writer.Write("关键字:");
            tbKey.RenderControl(writer);
            btnSearch.RenderControl(writer);
            writer.Write("</td></tr></table>");
        }
    }
}

这个webPart 核心就是修改它的Scheam就OK
listViewWebPart.ListViewXml = xmlDocument.InnerXml;(主要代码)


jianyi 的文章对我很大帮助。。。希望更多的朋友向建议学习。分享





posted @ 2008-05-15 16:43 A A 阅读(24) | 评论 (0)编辑

2008年5月9日 #

Feature Action List Settings


今天很无赖。。很痛苦。。。很郁闷。 。。。。


首先 code .cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
namespace ActionDemo
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:ListSettingsMenu runat=server></{0}:ListSettingsMenu>")]
    public class ListSettingsMenu : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }


        protected override void CreateChildControls()
        {
            //base.CreateChildControls();
            SubMenuTemplate listSettings = new SubMenuTemplate();
            listSettings.Text = "List Settings";
            listSettings.Description = "Manage settings for lists on this site";
            listSettings.ImageUrl = "/_layouts/images/lg_ICASCX.gif";

            foreach (SPList list in SPContext.Current.Web.Lists)
            {
                if (!list.Hidden)
                {
                    MenuItemTemplate listItem = new MenuItemTemplate();
                    listItem.Text = list.Title;
                    listItem.Description = string.Format(
                        "Manage settings for {0}", list.Title);

                    listItem.ImageUrl = list.ImageUrl;

                    string url = string.Format(
                        "{0}/_layouts/listedit.aspx?List={{{1}}}",
                        SPContext.Current.Web.Url, list.ID.ToString());
                    listItem.ClientOnClickNavigateUrl = url;

                    listSettings.Controls.Add(listItem);


                }
            }

            this.Controls.Add(listSettings);
        }
        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }
    }
}


Feature
feature.xml

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"

         Id="{abeaae41-f8bc-4d60-b793-1ab65e633009}"
         Title="AA is great "
         Description="default Site Actions menu of WSS site by adding extra menu options."
         Scope="Site"
        
         >
 <ElementManifests>
  <ElementManifest Location="manifest.xml"/>
 </ElementManifests>

</Feature>

manifest.xml

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

 <CustomAction Id="{99777c4a-55d9-459b-aefe-e38b0d610ee1}"
      Location="Microsoft.SharePoint.StandardMenu"
      GroupId="SiteActions"
      ControlAssembly="ActionDemo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bf2af071df56a875"
      ControlClass="ActionDemo.ListSettingsMenu"
    >
 </CustomAction>

</Elements>


Dll放在 GAC 或者BIN

然后 二个xml 文件放在
Feature  下面,自己建立一个文件夹

在 站点的Web.Config 文件里面注册 这个dll
这个不用我写吧。。一般的WebPart 都需要。。

然后安装

 

@SET TEMPLATEDIR="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\"

@SET STSADM="C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\BIN\stsadm"

xcopy /e /y TEMPLATE\* %TEMPLATEDIR%\Template

@ECHO ON

REM %STSADM% -o installfeature -name MyCustomListSettings -force
REM %STSADM% -o activatefeature -name MyCustomListSettings -force -url http://server:8000/

REM IISRESET /timeout:0


CustomAction 可以设置 Microsoft.SharePoint.StandardMenu

当然别的都可以设置。。。发挥你的想象去吧。/。。。


代码没有任何价值。。只是一种方式。。。


今天特烦。。。。








posted @ 2008-05-09 16:29 A A 阅读(33) | 评论 (0)编辑

SPPropertyBag Type



我们在使用一个site 保存信息的时候,可以使用 SPPropetryBag来很方便的存储!
Code:
 SPWeb spWeb = (new SPSite("http://AA.local")).OpenWeb();
SPPropertyBag spProperties = spWeb.Properties;
 
foreach (DictionaryEntry entry in spProperties)
  Console.WriteLine("   {0,-25} {1}", entry.Key, entry.Value);

我们还可以增加一个新的key and value

Code:

private void SetValue(String key, String value, String siteUrl) {
SPWeb spWeb = (new SPSite("http://AA.local")).OpenWeb();
SPPropertyBag spProperties = spWeb.Properties;
 
if (spProperties.ContainsKey(key)) {
spProperties[key] = Value;
} else {
spProperties.Add(Key, Value);
}
 
spProperties.Update();
}


posted @ 2008-05-09 14:20 A A 阅读(22) | 评论 (0)编辑

2008年5月7日 #

InfoPath 获取重复表的Value

    看到很多人需要,所以我写下来。。
   在以下示例中,将使用 SelectNodes(XPathNavigator,XPathNavigator,String) 方法选择绑定到 group2 的“重复表”控件的第一行中的节点。然后使用 GetContextNodes 方法基于当前所选项和指定节点返回上下文节点的集合。最后,代码将遍历上下文节点的集合,并显示每个节点的名称、内部 XML 和值。

// Create XPathNavigator and specify XPath for nodes.
XPathNavigator repeatingTableRow1 = MainDataSource.CreateNavigator().SelectSingleNode(
   "/my:myFields/my:group1/my:group2[1]", NamespaceManager);

// Select nodes in specified XPathNavigator.
CurrentView.SelectNodes(repeatingTableRow1,repeatingTableRow1,"CTRL5");

// Get context nodes in selection.
XPathNodeIterator contextNodes = CurrentView.GetContextNodes(repeatingTableRow1,"CTRL5");

// Loop through collection and display information.
foreach (XPathNavigator contextNode in contextNodes)
{
   MessageBox.Show(contextNode.Name);
   MessageBox.Show(contextNode.InnerXml);
   MessageBox.Show(contextNode.Value);
}

很简单就获取到重复表的Value..
希望对各位有帮助。。。

本文代码 。。来之MSDN。。 。

posted @ 2008-05-07 14:55 A A 阅读(44) | 评论 (2)编辑

2008年4月14日 #

MOSS WebPart and Link

     摘要: ActiveX Scripting Web Part (Simon Mourier) AD Management Web Part (Fabian) Alert Manager, Subweb Viewer Web Parts (Mart Muller) Avail Lists & Libraries (Sig Weber) Blogparts (S...  阅读全文

posted @ 2008-04-14 23:01 A A 阅读(91) | 评论 (1)编辑

2008年4月13日 #

MOSS 文章置顶

posted @ 2008-04-13 22:28 A A 阅读(85) | 评论 (0)编辑

2008年4月8日 #

记录中心配置

在"文档中心"里面点击某个需要归档的文档,选择下拉菜单里的“发送到”,再选择“记录中心”,这个文档就会归档到记录中心里对应的文档库里了。

配置步骤:

0. 创建需要分类归档的内容类型

在根网站上点击“网站操作”,选择“网站设置”-->“修改所有网站设置”进入网站内容类型库,创建一个名为“Contract”的,继承自“文档”的自定义内容类型。

1. 创建“记录中心”网站

在根网站上点击“网站操作”,选择“创建网站”。

在创建网站界面里选择“记录中心”模板。

假设此网站的URL为http://moss/records

2. 在“记录中心”网站里创建保存归档Contract的文档库

进入记录中心网站,“网站操作”-->“创建”-->“文档库”,选择此文档库名称为“Contracts”

3. 添加路由信息

在记录中心网站中,进入“记录路由”列表(应该叫这个吧,手头没有中文版。。。),点击“新建”,标题填“Contracts”,位置也填“Contracts”,Aliases(别名?)填“Contract”(即那个内容类型的标题)

image

4. 设置记录中心关联

进入SharePoint管理中心-->“Web应用程序”-->“记录中心”

选择“连接到一个记录中心”,URL里填:http://moss/records/_vti_bin/officialfile.asmx 

image

5. 使用“发送到”功能进行试用

在文档中心里,创建一个“Contract”类型的文档,点击之,在下拉选单中,可找到“发送到-->记录中心”

image

操作成功后,记录中心的“Contracts”文档库就会多出这条记录:

image

感觉很不错,所以留下做备份

http://blog.joycode.com/choral/archive/2008/03/13/114965.aspx 原作者

posted @ 2008-04-08 11:27 A A 阅读(66) | 评论 (1)编辑

2008年4月2日 #

MOSS审批工作流实现动态会签

      好久没有更新我的 Blog啦 。。可能是由于我最近比较忙,也可能是我的访问量太少,写的没有啥动力哦。。。如果大家想看到更多的好文章,请大家多多来骚扰!!!

言归正传:
应用场景:

(5.4 文件批准        
5.4.1 管理体系手册由总经理批准。                
5.4.2 程序文件由相关部门经理会签,总经理或管理者代表批准。   
5.4.3 作业文件由起草部门经理批准。当涉及到其它部门时需要由相关部门会签。)


如果同一个文件作者主管多种产品或编写多种文件则会有多种审批流程,没有固定的标准。

问题1
5.4.2 (关于部门经理可以在流程页面初始化的时候,在外面输入几个人会签,我会根据当前会签人数,但是我的流程设计会签渠道的时候,我都设计死拉,如果想要灵活的,
需要动态创建activity,根据人数来画会签渠道)  难度是不是很大哦。..

大家看看上面需求.MOSS+InfoPath+WF.你解决??
关键是会签是动态的。不知道几个人一起会签 ?


上面有一点就是需要动态会签,不知道有几个人审批,
经过朋友提点 。。需要用到WF 的复制组件,就可以解决这个问题。。。
不过首先我们还需要自己建立一个Activity,然后用复制组件 复制这个 Activity就可以啦 。。。
Activity :

WORKFLOW:

仔细观察我这个Workflow界面,这个里面只放一个replicatorActivity,然后在 这个里面放一个Activity
这样就可以用复制组件实现
Code:

Activity :Code

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;

namespace ManageHandBook
{
 public partial class ReTasksActivity: SequenceActivity
 {
  public ReTasksActivity()
  {
   InitializeComponent();
  }

        private static DependencyProperty InstanceDataProperty = DependencyProperty.Register("InstanceData", typeof(SPWorkflowTaskProperties), typeof(ReTasksActivity));

        [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
        [BrowsableAttribute(true)]
        public SPWorkflowTaskProperties InstanceData
        {
            get
            {
                return ((SPWorkflowTaskProperties)(base.GetValue(ReTasksActivity.InstanceDataProperty)));
            }
            set
            {
                base.SetValue(ReTasksActivity.InstanceDataProperty, value);
            }
        }

        private string comment;
        public string Comment
        {
            set { comment = value; }
            get { return comment; }
        }

 

        public Guid taskId1 = default(System.Guid);
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties taskProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties afterProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();
        public Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties beforeProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();

        private void createTask1_MethodInvoking(object sender, EventArgs e)
        {
            taskId1 = Guid.NewGuid();
            taskProperties1.TaskType = 0;
            taskProperties1.ExtendedProperties["afterComments"] = comment;
        }

        private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
        {
            comment = onTaskChanged1.AfterProperties.ExtendedProperties["comments"].ToString();
        }
 }
}


这个是 Activity里面的代码 很简单吧。。主要用 SPWorkflowTaskProperties   动态创建任务。。

Workflow.cs

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Workflow;
using System.Xml;
using System.Xml.Serialization;
namespace ManageHandBook
{
 public sealed partial class Workflow1: SequentialWorkflowActivity
 {
  public Workflow1()
  {
   InitializeComponent();
  }

        private void rePlicatorActivity_ChildCompleted(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
          
            comments = string.Format("{0}Approved {1}:{2}\n", comments, workflowProperties1.Web.AllUsers[activity.taskProperties1.AssignedTo].Name, activity.Comment);
 
        }

        private void rePlicatorActivity_ChildInitialized(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
            activity.taskProperties1 = e.InstanceData as SPWorkflowTaskProperties;
            activity.Comment = comments;
        }
        public Guid workflowId = default(System.Guid);
        public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties1 = new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();

        private string comments = string.Empty;
        private Person[] allPerson = null;
        private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
        {
            workflowId = workflowProperties1.WorkflowId;

            //反序列化workflowProperties.InitiationData以得到初始窗体的实例
            XmlSerializer xs = new XmlSerializer(typeof(Inits));
            XmlTextReader xtr = new XmlTextReader(new System.IO.StringReader(workflowProperties1.InitiationData));
            Inits init = (Inits)xs.Deserialize(xtr);
            allPerson = init.Contact;
            ArrayList Initlist = new ArrayList();
            for (int i = 0; i < allPerson.Length; i++)
            {
                SPWorkflowTaskProperties taskProperty = new SPWorkflowTaskProperties();
                taskProperty.AssignedTo = allPerson[i].AccountId;
                taskProperty.TaskType = 0;
                taskProperty.Title = string.Format("请审批 {0}", workflowProperties1.Item.DisplayName);
                Initlist.Add(taskProperty);
            }

            replicatorActivity.InitialChildData = Initlist;
        }
    }

}

Workflow 的代码更简单 。。。
复制组件的2个方法 更重要的哦。。
  private void rePlicatorActivity_ChildCompleted(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
          
            comments = string.Format("{0}Approved {1}:{2}\n", comments, workflowProperties1.Web.AllUsers[activity.taskProperties1.AssignedTo].Name, activity.Comment);
 
        }

        private void rePlicatorActivity_ChildInitialized(object sender, ReplicatorChildEventArgs e)
        {
            ReTasksActivity activity = e.Activity as ReTasksActivity;
            activity.taskProperties1 = e.InstanceData as SPWorkflowTaskProperties;
            activity.Comment = comments;
        }

看起来 代码很简单。却能实现很复杂的流程。动态会签当然不是问题。。
如果大家仿照 扩展 扩展。。确实可以实现很多应用。。

/Files/wanghao-3/ManageHandBook.rar

posted @ 2008-04-02 11:31 A A 阅读(238) | 评论 (1)编辑

2008年3月3日 #

MOSS精英峰会2008暨群友见面会 MOSS应用开发商参观门票(企业票)预订

 SharePoint  Conference  2008
 
    应众多群友的响应,由赏梅斋群委会承办 MOSS精英峰会2008于三月到四月间于北京举行。
 
     届时,全国众多MOSS精英将齐聚北京,进行交流与联谊!同时,将邀请微软MOSS技术专家、解决方案专家、销售经理、咨询顾问等,进行产品技术、市场、人材等多方面的交流。   
 
      欢迎微软合作伙伴(MOSS应用开发商)代表参加交流,参观门票2000元一张,做为峰会赞助,用于活动的组织。每个公司限购三张。购票公司可获得峰会活动MOSS精英通讯录一份以及其他重要礼品。  
 
     预订时间从2月20到3月20日,为期一个月,3月21日将公告活动的具体时间安排。 


地址:http://www.msotec.net/poc/mossdev/Lists/2008/overview.aspx

posted @ 2008-03-03 11:13 A A 阅读(87) | 评论 (1)编辑

2008年1月13日 #

K2 blackpearl 结合MOSS表单库实现请假流程


              下一个项目需要使用K2,所以提前学习下K2,学习几天后,感觉K2还不错,基于WF,和MOSS集成也还可以.今天熬夜写一些简单的MOSS和K2结合的信息
需求:

        1、公司人员填写假期申请单,单上面有姓名、时间,等信息
        2、如果请假天数是3天以下的话,该请假申请单将由人事部审批,如果是3天以上则由总经理审批后再交人事部审批
        3、人事部审批结果用邮件通知申请人,有3种结果:同意、拒绝
图1: 比较简单

首先用户申请:



申请后,可以在表单库里面到一个Process1 的任务表单,这个就是用户申请表单.


然后经理审批:
经理可以直接到worklist里面去审批.也可以直接点这个连接审批



经理审批后,流程跑到HR.



HR 再次审批 发送 Email  给用户.流程结束.


可以在worklist 的view里面查看流程的流转状态... K2真强大..

MOSS 和K2结合 感觉还行,如果在MOSS项目中,流程需要的很多,需要考虑上K2建议使用K2这个产品。
如果流程不是很多,可以直接用WF开发.也不难...


学历代表过去,能力代表现在,学习能力代表未来

posted @ 2008-01-13 00:26 A A 阅读(441) | 评论 (7)编辑