代码之家  ›  专栏  ›  技术社区  ›  Biff MaGriff

有人知道ASP.NET电子邮件控件/用户控件吗?

  •  2
  • Biff MaGriff  · 技术社区  · 15 年前

    我正在我的程序中实现一个消息传递系统。它的功能与电子邮件一样,只是它完全包含在系统中。

    我想知道是否有人看到过我可以修改的电子邮件控制模板。它将包含收件箱、消息查看和消息发送部分等内容。

    我只需将邮件的发送和接收部分重新连接到我的连接到我的表上。

    谢谢!

    <>编辑:

    好吧,我没意识到我写了这么多。如果你用这个的话,一定要相信Biff-Magriff。D 技术是.NET 3.5和亚音速3.0

    其余的都在我的答案中。

    最后应该是这样。(减去我所有的剪纸)

    web.config文件

    <pages>
    <控件>
    …
    <add tagprefix=“cc”tagname=“messagefolder”src=“~/usercontrols/messages/messagefolder/messagefolder.ascx”/>gt;
    <add tagprefix=“cc”tagname=“messageview”src=“~/usercontrols/messages/messageview/messageview.ascx”/>
    <add tagprefix=“cc”tagname=“messagecompose”src=“~/usercontrols/messages/messagecompose/messagecompose.ascx”/>gt;
    <add tagprefix=“cc”tagname=“messagebox”src=“~/usercontrols/messages/messagebox/messagebox.ascx”/>gt;
    …
    </controls>
    &页;
    < /代码> 
    
    

    应用程序代码/IMessagefolder.cs

    使用系统;
    使用system.collections.generic;
    使用system.linq;
    使用system.web;
    
    ///<摘要>
    ///IMessageFolder的摘要说明
    ///</summary>
    公共接口IMessageFolder
    {
    int?消息ID获取;
    }
    < /代码> 
    
    

    应用程序代码/自定义数据视图.cs

    使用系统;
    使用system.collections;
    使用system.collections.generic;
    使用系统数据;
    使用system.data.linq;
    使用system.linq;
    使用system.web;
    ///<摘要>
    ///自定义数据视图的摘要说明
    ///</summary>
    公共类CustomDataView
    {
    /亚音速DB
    static vac.data.vac db db=新vac.data.vac db();
    
    公共类消息查询
    {
    公共类消息
    {
    public int messageid_get;set;
    public string fromuser_get;set;
    公共字符串touser get;set;
    公共日期时间SentDate get;set;
    公共字符串主题get;set;
    公共字符串主体get;set;
    public bool isDeletedSender_get;set;
    public bool isDeletedRecipient获取;设置;
    公共bool isread get;set;
    }
    
    公共枚举mailtype receivedmail,sentmail
    
    public message[]getmessages(mailtype mt,bool showdeleted)
    {
    list<message>mymessages=新建列表<message>();
    
    foreach(var v in(从m in db.messages
    哪里(mt==mailtype.receivedmail?m.touserid:m.fromuserid)==common.currentuserid
    &&(显示已删除!(mt==mailtype.receivedmail?m.isDeleted收件人:m.isDeleted发件人)
    orderby m.sentdate降序
    选择M)
    {
    message mess=new message();
    message.messageid=v.messageid;
    mess.fromuser=(从u到db.users,其中u.userid==v.from userid选择u.username).first();
    mess.touser=(从u到db.users,其中u.userid==v.touserid选择u.username).first();
    mess.sentdate=v.sentdate;
    mess.subject=v.subject;
    mess.body=v.body;
    mess.isdeletedssender=v.isdeletedssender;
    mess.isDeletedRecipient=v.isDeletedRecipient;
    mess.isread=v.isread;
    mymessages.add(混乱);
    }
    
    返回mymessages.toarray();
    }
    
    公共消息getmessage(int messageid)
    {
    var mymessage=(来自db.messages中的m,其中m.messageid==messageid选择m);
    if(mymessage.count()==1)
    {
    var v=mymessage.first();
    message mess=new message();
    message.messageid=v.messageid;
    mess.fromuser=(从u到db.users,其中u.userid==v.from userid选择u.username).first();
    mess.touser=(从u到db.users,其中u.userid==v.touserid选择u.username).first();
    mess.sentdate=v.sentdate;
    mess.subject=v.subject;
    mess.body=v.body;
    返回混乱;
    }
    其他的
    返回空;
    }
    }
    
    }
    < /代码> 
    
    

    应用程序代码/common.cs

    使用系统;
    使用system.collections.generic;
    使用system.web;
    使用system.web.ui;
    使用system.web.ui.webcontrols;
    使用system.web.sessionstate;
    使用system.web.configuration;
    使用系统数据;
    使用system.text;
    使用system.collections;
    使用系统。全球化;
    使用system.linq;
    
    ///<摘要>
    ///常用的摘要说明
    ///</summary>
    公共类公共
    {
    ///<摘要>
    ///从GridView中检索列的索引。如果找不到,返回-1。
    ///</summary>
    ///<param name=“gv”></param>
    ///<param name=“columnname”></param>
    ///<退货></退货>
    静态公共int getcolumnindex(gridview gv,string columnname)
    {
    int-returnme=-1;
    对于(int i=0;i<gv.columns.count;i++)
    {
    if(gv.columns[i].headerText==columnname)
    {
    返回= i;
    断裂;
    }
    }
    归还归还我;
    }
    
    //网格视图的颜色
    静态公共字符串bgcolorred=“ff8888”;
    静态公共字符串bgColorRedAlternate=“ff0000”;
    
    静态公共字符串bgColorBlue=“aaff”;
    静态公共字符串bgcolorbluealternate=“444444ff”;
    
    静态公共字符串bgColorGreen=“2bf053”;
    静态公共字符串bgColorGreenAlternate=“27c319”;
    
    静态公共字符串bgColorOrange=“ffa365”;
    静态公共字符串bgColorOrangeAlternate=“ff6600”;
    
    静态公共字符串NormalBgColour(对象发送程序)
    {
    返回“*”+
    ((GridView)sender).rowstyle.backcolor.r.toString(“x”)。+
    ((GridView)发件人).rowstyle.backcolor.g.toString(“x”)。+
    ((gridview)sender).rowstyle.backcolor.b.toString(“x”);
    }
    
    静态公共字符串AlternateBgColor(对象发送程序)
    {
    返回“*”+
    ((GridView)发件人).AlternatingRowstyle.BackColor.R.ToString(“X”)。+
    ((GridView)发件人)。AlternatingRowsStyle.BackColor.G.ToString(“X”)。+
    (GridView)sender).AlternatingRowstyle.BackColor.B.ToString(“X”);
    }
    
    静态公共字符串selectedbgcolour(对象发送程序)
    {
    string selectedbgcolour=“165EA9”;
    
    如果(!)((GridView)发件人)。SelectedRowStyle.BackColor.IsEmpty)
    {
    selectedbgcolour=“”+
    (gridview)sender).selectedrowstyle.backcolor.r.toString(“x”)。+
    (gridview)sender).selectedrowstyle.backcolor.g.toString(“x”)。+
    (gridview)sender).selectedrowstyle.backcolor.b.toString(“x”);
    }
    返回所选背景颜色;
    }
    
    ///<摘要>
    ///GridView行数据绑定扩展。
    ///通过单击一行来允许行选择,并在鼠标悬停时以黄色突出显示该行。
    ///</summary>
    ///<param name=“sender”></param>
    ///<param name=“e”></param>
    静态公共void gridview_rowdatabound(对象发送方,gridviewrowEventargs e)
    {
    if(e.row.dataitemindex=-1)
    返回;
    
    //e.row.attributes.add(“onclick”,((gridview)sender).page.clientscript.getPostbackEventReference((gridview)sender,“select$”+e.row.rowindex.toString(),false));
    
    string selectedbgcolour=selectedbgcolour(发送方);
    字符串normalbgcolour=normalbgcolour(发送方);
    string alternatebgcolor=alternatebgcolor(sender);
    
    应用Y轴或W轴(例如,行、所选B颜色、标准B颜色、交替B颜色);
    }
    
    静态公共void applystylingtorow(gridviewrow行,string selectedbgcolour,string normalbgcolour,string alternatebgcolour)
    {
    appendattribute(行,“onMouseOver”,
    “this.style.cursor='pointer';this.style.background='yellow';”);
    appendattribute(行,“onMouseOut”,
    “this.style.background=''+((row.rowstate&datacontrolrowstate.selected)==datacontrolrowstate.selected?”所选背景颜色:
    (row.rowstate&datacontrolrowstate.alternate)==datacontrolrowstate.alternate?AlternateBgColor:NormalBgColor)+“';”);
    }
    
    
    静态公共void gridviewaddrowclick(gridview gv,gridview row row,bool isrender)
    {
    appendattribute(row,“onclick”,gv.page.clientscript.getPostbackEventReference(gv,“select$”+row.rowIndex.toString(),isrender)+“;”);
    /*
    对于(int i=0;i<gv.columns.count;i++)
    如果(!)string.isNullOrEmpty(gv.columns[i].headerText)&&row.cells.count>1)
    appendattribute(row.cells[i],“onclick”,gv.page.clientscript.getPostbackEventReference(gv,“select$”+row.rowIndex.toString(),isrender)+“;”);
    **
    }
    
    静态公共void gridviewrowclick_render(gridview gv)
    {
    foreach(gv.rows中的gridviewrow行)
    if(row.rowtype==DataControlRowType.DataRow)
    GridView添加行单击(gv,row,true);
    gv.page.clientscript.registerforeventvalidation(gv.uniqueid)验证;
    }
    
    ///<摘要>
    ///隐藏GridView上的列。
    ///</summary>
    ///<param name=“gv”></param>
    ///<param name=“ColumnIndex”></param>
    静态公共void hidecolumn(gridview gv,int columnindex)
    {
    如果(gv.headerrow!=空)
    gv.headerRow.cells[columnIndex].style.add(“显示”,“无”);
    foreach(gv.rows中的gridviewrow行)
    {
    if(row.rowtype==DataControlRowType.DataRow)
    row.cells[columnindex].style.add(“display”,“none”);
    }
    }
    
    ///<摘要>
    ///注册要运行的javascript。
    ///</summary>
    ///<param name=“con”></param>
    ///<param name=“script”></param>
    静态公共void registerstartupscript(对象con,字符串脚本)
    {
    寄存器startupscript((control)con,script);
    }
    
    ///<摘要>
    ///将字符串的开头大写
    ///</summary>
    ///<param name=“strtext”></param>
    公共静态字符串initcap(字符串strtext)
    {
    返回new cultureinfo(“en”).textinfo.toitlecase(strtext.tolower());
    }
    
    ///<摘要>
    ///注册要运行的javascript。
    ///</summary>
    ///<param name=“con”></param>
    ///<param name=“script”></param>
    静态公共void registerstartupscript(control con,string script)
    {
    scriptmanager sm=scriptmanager.getcurrent(con.page);
    如果(SM)!=空)
    scriptmanager.registerStartupscript(con,con.getType(),guid.newguid().toString(),script,true);
    其他的
    con.page.clientscript.registerStartupscript(typeof(page),guid.newguid().toString(),script,true);
    }
    
    ///<摘要>
    ///注册要包含在页面中的javascript文件。
    ///</summary>
    ///<param name=“con”></param>
    ///<param name=“url”></param>
    静态公共void RegisterClientScriptInclude(控件con,字符串url)
    {
    scriptmanager sm=scriptmanager.getcurrent(con.page);
    如果(SM)!=空)
    scriptmanager.registerClientScriptinclude(con,con.getType(),guid.newguid().toString(),system.web.hosting.hostingEnvironment.applicationVirtualPath+url);
    其他的
    con.page.clientscript.registerClientScriptinclude(typeof(page),guid.newguid().toString(),system.web.hosting.hostingenvironment.applicationvirtualpath+url);
    }
    
    public static int current userid get return(从新vac.data.vacdb()中的u返回。其中u.user name==httpcontext.current.user.identity.name选择u.userid的用户)。first();
    
    公共类MessageComposeEventArgs:EventArgs
    {
    公共int?sendtouserid获取;设置;
    公共字符串主题get;set;
    
    public messagecomposeEventArgs()。
    {
    }
    
    public messagecomposeEventArgs(int sendtouserid)
    {
    this.sendtouserid=sendtouserid;
    }
    
    public messagecomposeEventargs(int sendtouserid,string subject)
    {
    this.sendtouserid=sendtouserid;
    this.subject=主题;
    }
    }
    }
    < /代码> 
    
    

    应用程序代码/extendedcommandfield.cs

    使用系统;
    使用system.collections.generic;
    使用system.componentmodel;
    使用system.linq;
    使用system.web;
    使用system.web.ui;
    使用system.web.ui.webcontrols;
    
    
    ///<摘要>
    ///允许删除的扩展<请参阅cref=“commandfield”/>
    ///待用户确认。
    ///</summary>
    公共类extendedcommandField:commandField
    {
    ///<摘要>
    ///初始化单元格。
    ///</summary>
    公共重写void InitializeCell(DataControlFieldCell单元,
    DataControlCellType CellType、DataControlRowState RowState、Int RowIndex)
    {
    base.initializeCell(单元格,CellType,RowState,RowIndex);
    如果(!)string.isNullOrEmpty(this.DeleteConfirmationText)和this.ShowDeleteButton)
    {
    foreach(cell.controls中的控件控件)
    {
    ibutontrol button=控制为ibutontrol;
    如果(按钮)!=空&&button.commandname==“删除”)
    //添加删除确认
    ((webcontrol)control).attributes.add(“onclick”,string.format)
    (如果)!confirm(“0”)返回false;“,this.deleteConfirmationText));
    }
    }
    }
    
    #区域删除确认文本
    ///<摘要>
    ///删除确认文本。
    ///</summary>
    [类别(“行为”)]
    [说明(“向用户显示确认删除的文本。”)]
    公共字符串DeleteConfirmationText
    {
    get将此.viewstate[“deleteConfirmationText”]作为字符串返回;
    设置this.viewstate[“删除确认文本”]=值;
    }
    γ端区
    }
    < /代码> 
    
    

    ~/usercontrols/messages/messagefolder/messagefolder.ascx

    <%@control language=“c”autoeventwireup=“true”codefile=“messagefolder.ascx.cs”
    inherits=“用户控件\u邮件\u邮件文件夹\u邮件文件夹”%>
    <asp:updatepanel id=“up1”runat=“server”>
    <内容模板>
    <asp:hiddenfield id=“hfmessageid”runat=“server”/>
    <asp:button id=“butfresh”runat=“server”text=“检查新消息”/>gt;<asp:button
    id=“butchompose”runat=“server”text=“compose new message”onclick=“butchompose\u click”/><asp:复选框
    autopostback=“true”id=“cbshowDeleted”runat=“server”text=“显示已删除邮件”
    oncheckedChanged=“cbshowDeleted_checkChanged”/>
    <asp:gridview id=“gvmessages”runat=“server”datakeynames=“messageid”autogenerateColumns=“false”
    onRowDatabound=“gvMessages_RowDatabound”onSelectedIndexChanged=“gvMessages_SelectedIndexChanged”
    onRowDeleting=“gvMessages_RowDeleting”width=“100%”style=“float:left;”>
    列;
    <asp:boundfield datafield=“messageid”insertvisible=“false”/>
    <cc:extendedCommandField DeleteConfirmationText=“是否确定要删除此记录?”
    deletetext=“delete”showDeleteButton=“true”/>
    <asp:boundfield datafield=“fromuser”headertex=“from”/>
    <asp:boundfield datafield=“touser”headertex=“to”/>
    <asp:模板字段>
    <headerTemplate>
    发送日期</headertemplate>
    <项目模板>
    <asp:label id=“lbl1”runat=“server”text=<%bind(“sentdate”)%>'style=“white space:nowrap;”/></itemtemplate>
    </asp:templatefield>
    <asp:boundField datafield=“subject”headerText=“subject”itemstyle width=“100%”/>
    </columns>
    </asp:gridview>
    </contenttemplate>
    </asp:updatepanel>
    < /代码> <和电子邮件一样,只是它完全包含在系统中。

    我想知道是否有人看到过我可以修改的电子邮件控制模板。它有收件箱、查看邮件和发送邮件等功能。

    我只需将邮件的发送和接收部分重新连接到我的桌子上。

    谢谢!

    编辑:

    好吧,我没意识到我写了这么多。如果你用这个的话,一定要相信Biff-Magriff。D 技术是.NET 3.5和亚音速3.0

    其余的在我的答案里。

    最后应该是这样。(减去我所有的切口)

    alt text

    Web.CONFIG

    <pages>
        <controls>
            ...
            <add tagPrefix="cc" tagName="MessageFolder" src="~/UserControls/Messages/MessageFolder/MessageFolder.ascx"/>
            <add tagPrefix="cc" tagName="MessageView" src="~/UserControls/Messages/MessageView/MessageView.ascx"/>
            <add tagPrefix="cc" tagName="MessageCompose" src="~/UserControls/Messages/MessageCompose/MessageCompose.ascx"/>
            <add tagPrefix="cc" tagName="MessageBox" src="~/UserControls/Messages/MessageBox/MessageBox.ascx"/>
            ...
        </controls>
    <pages>
    

    应用程序代码/IMessagefolder.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for IMessageFolder
    /// </summary>
    public interface IMessageFolder
    {
        int? MessageID { get; }
    }
    

    应用程序代码/customdataviews.cs

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Linq;
    using System.Linq;
    using System.Web;
    /// <summary>
    /// Summary description for CustomDataViews
    /// </summary>
    public class CustomDataViews
    {
        //Subsonic db
        static VAC.Data.VACDB db = new VAC.Data.VACDB();
    
        public class MessageQuery
        {
            public class Message
            {
                public int MessageID { get; set; }
                public string FromUser { get; set; }
                public string ToUser { get; set; }
                public DateTime SentDate { get; set; }
                public string Subject { get; set; }
                public string Body { get; set; }
                public bool IsDeletedSender { get; set; }
                public bool IsDeletedRecipient { get; set; }
                public bool IsRead { get; set; }
            }
    
            public enum MailType { ReceivedMail, SentMail };
    
            public Message[] GetMessages(MailType mt, bool showDeleted)
            {
                List<Message> myMessages = new List<Message>();
    
                foreach (var v in (from m in db.Messages
                                   where (mt == MailType.ReceivedMail ? m.ToUserID : m.FromUserID) == Common.CurrentUserID
                                   && (showDeleted || !(mt == MailType.ReceivedMail ? m.IsDeletedRecipient : m.IsDeletedSender))
                                   orderby m.SentDate descending
                                   select m))
                {
                    Message mess = new Message();
                    mess.MessageID = v.MessageID;
                    mess.FromUser = (from u in db.Users where u.UserID == v.FromUserID select u.UserName).First();
                    mess.ToUser = (from u in db.Users where u.UserID == v.ToUserID select u.UserName).First();
                    mess.SentDate = v.SentDate;
                    mess.Subject = v.Subject;
                    mess.Body = v.Body;
                    mess.IsDeletedSender = v.IsDeletedSender;
                    mess.IsDeletedRecipient = v.IsDeletedRecipient;
                    mess.IsRead = v.IsRead;
                    myMessages.Add(mess);
                }
    
                return myMessages.ToArray();
            }
    
            public Message GetMessage(int MessageID)
            {
                var myMessage = (from m in db.Messages where m.MessageID == MessageID select m);
                if (myMessage.Count() == 1)
                {
                    var v = myMessage.First();
                    Message mess = new Message();
                    mess.MessageID = v.MessageID;
                    mess.FromUser = (from u in db.Users where u.UserID == v.FromUserID select u.UserName).First();
                    mess.ToUser = (from u in db.Users where u.UserID == v.ToUserID select u.UserName).First();
                    mess.SentDate = v.SentDate;
                    mess.Subject = v.Subject;
                    mess.Body = v.Body;
                    return mess;
                }
                else
                    return null;
            }
        }
    
    }
    

    应用程序代码/common.cs

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.SessionState;
    using System.Web.Configuration;
    using System.Data;
    using System.Text;
    using System.Collections;
    using System.Globalization;
    using System.Linq;
    
    /// <summary>
    /// Summary description for Common
    /// </summary>
    public class Common
    {
        /// <summary>
        /// Retrieves the index of the column from the gridview. Returns -1 if not found.
        /// </summary>
        /// <param name="gv"></param>
        /// <param name="columnName"></param>
        /// <returns></returns>
        static public int GetColumnIndex(GridView gv, string columnName)
        {
            int returnMe = -1;
            for (int i = 0; i < gv.Columns.Count; i++)
            {
                if (gv.Columns[i].HeaderText == columnName)
                {
                    returnMe = i;
                    break;
                }
            }
            return returnMe;
        }
    
        //Colours for gridviews
        static public string BGColourRed = "#FF8888";
        static public string BGColourRedAlternate = "#FF0000";
    
        static public string BGColourBlue = "#AAAAFF";
        static public string BGColourBlueAlternate = "#4444FF";
    
        static public string BGColourGreen = "#2bf053";
        static public string BGColourGreenAlternate = "#27c319";
    
        static public string BGColourOrange = "#FFA365";
        static public string BGColourOrangeAlternate = "#FF6600";
    
        static public string NormalBGColour(object sender)
        {
            return "#" +
                ((GridView)sender).RowStyle.BackColor.R.ToString("X") +
                ((GridView)sender).RowStyle.BackColor.G.ToString("X") +
                ((GridView)sender).RowStyle.BackColor.B.ToString("X");
        }
    
        static public string AlternateBGColour(object sender)
        {
            return "#" +
                ((GridView)sender).AlternatingRowStyle.BackColor.R.ToString("X") +
                ((GridView)sender).AlternatingRowStyle.BackColor.G.ToString("X") +
                ((GridView)sender).AlternatingRowStyle.BackColor.B.ToString("X");
        }
    
        static public string SelectedBGColour(object sender)
        {
            string selectedBGColour = "#165EA9";
    
            if (!((GridView)sender).SelectedRowStyle.BackColor.IsEmpty)
            {
                selectedBGColour = "#" +
                   ((GridView)sender).SelectedRowStyle.BackColor.R.ToString("X") +
                   ((GridView)sender).SelectedRowStyle.BackColor.G.ToString("X") +
                   ((GridView)sender).SelectedRowStyle.BackColor.B.ToString("X");
            }
            return selectedBGColour;
        }
    
        /// <summary>
        /// Gridview RowDataBound extension.
        /// Allows row selection by clicking on a row and highlights the row in yellow on the mouse hover.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static public void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.DataItemIndex == -1)
                return;
    
            //e.Row.Attributes.Add("onclick", ((GridView)sender).Page.ClientScript.GetPostBackEventReference((GridView)sender, "Select$" + e.Row.RowIndex.ToString(), false));
    
            string selectedBGColour = SelectedBGColour(sender);
            string normalBGColour = NormalBGColour(sender);
            string alternateBGColour = AlternateBGColour(sender);
    
            ApplyStylingToRow(e.Row, selectedBGColour, normalBGColour, alternateBGColour);
        }
    
        static public void ApplyStylingToRow(GridViewRow row, string selectedBGColour, string normalBGColour, string alternateBGColour)
        {
            AppendAttribute(row, "onMouseOver",
                   "this.style.cursor='pointer'; this.style.background='yellow';");
            AppendAttribute(row, "onMouseOut",
                "this.style.background='" + ((row.RowState & DataControlRowState.Selected) == DataControlRowState.Selected ? selectedBGColour :
                (row.RowState & DataControlRowState.Alternate) == DataControlRowState.Alternate ? alternateBGColour : normalBGColour) + "';");
        }
    
    
        static public void GridViewAddRowClick(GridView gv, GridViewRow row, bool isRender)
        {
            AppendAttribute(row, "onclick", gv.Page.ClientScript.GetPostBackEventReference(gv, "Select$" + row.RowIndex.ToString(), isRender) + ";");
            /*
            for (int i = 0; i < gv.Columns.Count; i++)
                if (!string.IsNullOrEmpty(gv.Columns[i].HeaderText) && row.Cells.Count > 1)
                    AppendAttribute(row.Cells[i], "onclick", gv.Page.ClientScript.GetPostBackEventReference(gv, "Select$" + row.RowIndex.ToString(), isRender) + ";");
             * */
        }
    
        static public void GridViewRowClick_Render(GridView gv)
        {
            foreach (GridViewRow row in gv.Rows)
                if (row.RowType == DataControlRowType.DataRow)
                    GridViewAddRowClick(gv, row, true);
            gv.Page.ClientScript.RegisterForEventValidation(gv.UniqueID);
        }
    
            /// <summary>
        /// Hides a column on a gridview.
        /// </summary>
        /// <param name="gv"></param>
        /// <param name="columnIndex"></param>
        static public void HideColumn(GridView gv, int columnIndex)
        {
            if (gv.HeaderRow != null)
                gv.HeaderRow.Cells[columnIndex].Style.Add("display", "none");
            foreach (GridViewRow row in gv.Rows)
            {
                if (row.RowType == DataControlRowType.DataRow)
                    row.Cells[columnIndex].Style.Add("display", "none");
            }
        }
    
        /// <summary>
        /// Registers javascript to be run.
        /// </summary>
        /// <param name="con"></param>
        /// <param name="script"></param>
        static public void RegisterStartupScript(object con, string script)
        {
            RegisterStartupScript((Control)con, script);
        }
    
        /// <summary>
        /// Capitalizes the beginning of strings
        /// </summary>
        /// <param name="strText"></param>
        public static string InitCap(string strText)
        {
            return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
        }
    
        /// <summary>
        /// Registers javascript to be run.
        /// </summary>
        /// <param name="con"></param>
        /// <param name="script"></param>
        static public void RegisterStartupScript(Control con, string script)
        {
            ScriptManager sm = ScriptManager.GetCurrent(con.Page);
            if (sm != null)
                ScriptManager.RegisterStartupScript(con, con.GetType(), Guid.NewGuid().ToString(), script, true);
            else
                con.Page.ClientScript.RegisterStartupScript(typeof(Page), Guid.NewGuid().ToString(), script, true);
        }
    
        /// <summary>
        /// Registers a javascript file to be included in the page.
        /// </summary>
        /// <param name="con"></param>
        /// <param name="url"></param>
        static public void RegisterClientScriptInclude(Control con, string url)
        {
            ScriptManager sm = ScriptManager.GetCurrent(con.Page);
            if (sm != null)
                ScriptManager.RegisterClientScriptInclude(con, con.GetType(), Guid.NewGuid().ToString(), System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath + url);
            else
                con.Page.ClientScript.RegisterClientScriptInclude(typeof(Page), Guid.NewGuid().ToString(), System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath + url);
        }
    
        public static int CurrentUserID { get { return (from u in new VAC.Data.VACDB().Users where u.UserName == HttpContext.Current.User.Identity.Name select u.UserID).First(); } }
    
        public class MessageComposeEventArgs : EventArgs
        {
            public int? SendToUserID { get; set; }
            public string Subject { get; set; }
    
            public MessageComposeEventArgs()
            {
            }
    
            public MessageComposeEventArgs(int SendToUserID)
            {
                this.SendToUserID = SendToUserID;
            }
    
            public MessageComposeEventArgs(int SendToUserID, string Subject)
            {
                this.SendToUserID = SendToUserID;
                this.Subject = Subject;
            }
        }
    }
    

    应用程序代码/extendedcommandfield.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    /// <summary>
    /// An extended <see cref="CommandField"/> that allows deletions
    /// to be confirmed by the user.
    /// </summary>
    public class ExtendedCommandField : CommandField
    {
        /// <summary>
        /// Initialize the cell.
        /// </summary>
        public override void InitializeCell(DataControlFieldCell cell,
            DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
        {
            base.InitializeCell(cell, cellType, rowState, rowIndex);
            if (!string.IsNullOrEmpty(this.DeleteConfirmationText) && this.ShowDeleteButton)
            {
                foreach (Control control in cell.Controls)
                {
                    IButtonControl button = control as IButtonControl;
                    if (button != null && button.CommandName == "Delete")
                        // Add delete confirmation
                        ((WebControl)control).Attributes.Add("onclick", string.Format
                        ("if (!confirm('{0}')) return false;", this.DeleteConfirmationText));
                }
            }
        }
    
        #region DeleteConfirmationText
        /// <summary>
        /// Delete confirmation text.
        /// </summary>
        [Category("Behavior")]
        [Description("The text shown to the user to confirm the deletion.")]
        public string DeleteConfirmationText
        {
            get { return this.ViewState["DeleteConfirmationText"] as string; }
            set { this.ViewState["DeleteConfirmationText"] = value; }
        }
        #endregion
    }
    

    ~/usercontrols/messages/messagefolder/messagefolder.ascx

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageFolder.ascx.cs"
        Inherits="UserControls_Messages_MessageFolder_MessageFolder" %>
    <asp:UpdatePanel ID="up1" runat="server">
        <ContentTemplate>
            <asp:HiddenField ID="hfMessageID" runat="server" />
            <asp:Button ID="butRefresh" runat="server" Text="Check for new Messages" /><asp:Button
                ID="butCompose" runat="server" Text="Compose New Message" OnClick="butCompose_Click" /><asp:CheckBox
                    AutoPostBack="true" ID="cbShowDeleted" runat="server" Text="Show Deleted Messages"
                    OnCheckedChanged="cbShowDeleted_CheckChanged" />
            <asp:GridView ID="gvMessages" runat="server" DataKeyNames="MessageID" AutoGenerateColumns="false"
                OnRowDataBound="gvMessages_RowDataBound" OnSelectedIndexChanged="gvMessages_SelectedIndexChanged"
                OnRowDeleting="gvMessages_RowDeleting" Width="100%" Style="float: left;">
                <Columns>
                    <asp:BoundField DataField="MessageID" InsertVisible="false" />
                    <cc:ExtendedCommandField DeleteConfirmationText="Are you certain you wish to delete this record?"
                        DeleteText="Delete" ShowDeleteButton="true" />
                    <asp:BoundField DataField="FromUser" HeaderText="From" />
                    <asp:BoundField DataField="ToUser" HeaderText="To" />
                    <asp:TemplateField>
                        <HeaderTemplate>
                            Sent Date</HeaderTemplate>
                        <ItemTemplate>
                            <asp:Label ID="lbl1" runat="server" Text='<%# Bind("SentDate") %>' Style="white-space: nowrap;" /></ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="Subject" HeaderText="Subject" ItemStyle-Width="100%" />
                </Columns>
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Biff MaGriff    15 年前

    我最终创建了自己的用户控件。如果有人感兴趣的话,我会把细节贴出来。

    编辑:

    好吧,我没意识到我写了这么多。如果你用这个的话,一定要相信Biff-Magriff。D 技术是.NET 3.5和亚音速3.0

    最后应该是这样。

    嗯,不能超过3万个字符…

    从上面继续。

    ~/usercontrols/messages/messagefolder/messagefolder.ascx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class UserControls_Messages_MessageFolder_MessageFolder : System.Web.UI.UserControl, IMessageFolder
    {
        private static int IDCOLUMNINDEX = 0;
        private static int DELETECOLUMNINDEX = 1;
        private static int FROMCOLUMNINDEX = 2;
        private static int TOCOLUMNINDEX = 3;
    
        public event SelectedIndexChangedEventHandler SelectedIndexChanged;
        public delegate void SelectedIndexChangedEventHandler(object sender, EventArgs e);
    
        public event ComposeMessageEventHandler ComposeMessage;
        public delegate void ComposeMessageEventHandler(object sender, Common.MessageComposeEventArgs e);
    
        VAC.Data.VACDB db = new VAC.Data.VACDB();
    
        public int? MessageID
        {
            get
            {
                int id;
                if (int.TryParse(hfMessageID.Value, out id))
                    return id;
                else
                    return null;
            }
        }
    
        public CustomDataViews.MessageQuery.MailType MailType { get; set; }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (MailType == CustomDataViews.MessageQuery.MailType.SentMail)
            {
                butCompose.Visible = false;
            }
            Refresh();
        }
    
        public void Refresh()
        {
            gvMessages.DataSource = new CustomDataViews.MessageQuery().GetMessages(MailType, cbShowDeleted.Checked);
            gvMessages.DataBind();
            Common.HideColumn(gvMessages, IDCOLUMNINDEX);
            if (MailType == CustomDataViews.MessageQuery.MailType.ReceivedMail)
                Common.HideColumn(gvMessages, TOCOLUMNINDEX);
            else
                Common.HideColumn(gvMessages, FROMCOLUMNINDEX);
        }
    
        protected void gvMessages_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            Common.GridView_RowDataBound(sender, e);
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                CustomDataViews.MessageQuery.Message dataItem = ((CustomDataViews.MessageQuery.Message)e.Row.DataItem);
    
                if (dataItem.IsDeletedSender && MailType == CustomDataViews.MessageQuery.MailType.SentMail
                    || dataItem.IsDeletedRecipient && MailType == CustomDataViews.MessageQuery.MailType.ReceivedMail)
                {
                    foreach (TableCell tc in e.Row.Cells)
                        tc.Enabled = false;
                    e.Row.Cells[DELETECOLUMNINDEX].Enabled = true;
                    ((LinkButton)e.Row.Cells[DELETECOLUMNINDEX].Controls[0]).Text = "Undelete";
                    ((LinkButton)e.Row.Cells[DELETECOLUMNINDEX].Controls[0]).Attributes.Clear();
                }
                if (!dataItem.IsRead && MailType == CustomDataViews.MessageQuery.MailType.ReceivedMail)
                {
                    //colouring for initial load
                    if ((e.Row.RowState & DataControlRowState.Alternate) == DataControlRowState.Alternate)
                        e.Row.BackColor = System.Drawing.ColorTranslator.FromHtml(Common.BGColourGreenAlternate);
                    else
                        e.Row.BackColor = System.Drawing.ColorTranslator.FromHtml(Common.BGColourGreen);
                    //colouring for onmouse out
                    Common.ApplyStylingToRow(e.Row, Common.SelectedBGColour(sender), Common.BGColourGreen, Common.BGColourGreenAlternate);
                }
            }
    
            if (ScriptManager.GetCurrent(this.Page).IsInAsyncPostBack && e.Row.RowType == DataControlRowType.DataRow)
                Common.GridViewAddRowClick(gvMessages, e.Row, false);
        }
    
        protected void gvMessages_SelectedIndexChanged(object sender, EventArgs e)
        {
            hfMessageID.Value = gvMessages.SelectedValue != null ? gvMessages.SelectedValue.ToString() : "";
            if (MailType == CustomDataViews.MessageQuery.MailType.ReceivedMail)
            {
                var mess = (from m in db.Messages where m.MessageID == MessageID.Value select m);
                if (mess.Count() == 1)
                {
                    var message = mess.First();
                    message.IsRead = true;
                    message.Save();
                }
            }
    
            if (this.SelectedIndexChanged != null)
                SelectedIndexChanged(this, new EventArgs());
            this.Refresh();
        }
    
        protected void gvMessages_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            int id;
            if (int.TryParse(((GridView)sender).Rows[e.RowIndex].Cells[IDCOLUMNINDEX].Text, out id))
            {
                var message = (from m in db.Messages where m.MessageID == id select m).First();
                if (!message.IsDeletedRecipient && MailType == CustomDataViews.MessageQuery.MailType.ReceivedMail)
                    message.IsDeletedRecipient = true;
                else
                    message.IsDeletedRecipient = false;
                message.Save();
    
                if (!message.IsDeletedSender && MailType == CustomDataViews.MessageQuery.MailType.SentMail)
                    message.IsDeletedSender = true;
                else
                    message.IsDeletedSender = false;
                message.Save();
    
                gvMessages.SelectedIndex = -1;
                gvMessages_SelectedIndexChanged(gvMessages, new EventArgs());
            }
            Refresh();
        }
    
        protected override void Render(HtmlTextWriter writer)
        {
            Common.GridViewRowClick_Render(gvMessages);
            base.Render(writer);
        }
    
        protected void butCompose_Click(object sender, EventArgs e)
        {
            if (this.ComposeMessage != null)
            {
                this.ComposeMessage(this, new Common.MessageComposeEventArgs());
            }
        }
    
        protected void cbShowDeleted_CheckChanged(object sender, EventArgs e)
        {
            Refresh();
        }
    }
    

    消息撰写.ascx

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageCompose.ascx.cs"
        Inherits="UserControls_Messages_MessageCompose_MessageCompose" %>
    <div>
        <table style="width: 100%;">
            <tr>
                <td>
                    <asp:Label ID="Label1" runat="server" Text="To :" />
                </td>
                <td style="width:100%">
                    <asp:DropDownList ID="ddlToUser" runat="server" AppendDataBoundItems="true" DataSourceID="odsUsers"
                        DataTextField="UserName" DataValueField="UserID">
                        <asp:ListItem Text="--Select--" Value="" />
                    </asp:DropDownList>
                    <asp:ObjectDataSource ID="odsUsers" runat="server" SelectMethod="GetUsers" TypeName="CustomDataViews+UserListQuery">
                    </asp:ObjectDataSource>
                    <asp:RequiredFieldValidator ID="rfv1" runat="server" Text="*" ControlToValidate="ddlToUser"
                        ValidationGroup="Compose" />
                </td>
            </tr>
            <tr>
                <td>
                    <asp:Label ID="Label2" runat="server" Text="Subject :" />
                </td>
                <td style="padding: 1px 5px 1px 1px">
                    <asp:TextBox ID="tbSubject" runat="server" Width="100%" />
                </td>
            </tr>
            <tr>
                <td colspan="2" style="padding: 1px 5px 1px 1px">
                    <asp:TextBox ID="tbBody" runat="server" TextMode="MultiLine" Style="width: 100%"
                        Rows="20" />
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <table width="100%">
                        <tr>
                            <td align="center">
                                <asp:Label ID="lblMessageSentText" runat="server" Text="Your message was sent." CssClass="info" Visible="false" />
                            </td>
                            <td align="right">
                                <asp:Button ID="butSend" runat="server" Text="Send" OnClick="butSend_Click" ValidationGroup="Compose"
                                     />
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </div>
    

    消息撰写.ascx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using VAC.Data;
    
    public partial class UserControls_Messages_MessageCompose_MessageCompose : System.Web.UI.UserControl
    {
        public event MessageSentEventHandler MessageSent;
        public delegate void MessageSentEventHandler(object sender, EventArgs e);
    
        public int? SendToUserID
        {
            set
            {
                if (ddlToUser.Items.FindByValue(value.HasValue ? value.Value.ToString() : "") != null)
                    ddlToUser.SelectedValue = value.HasValue ? value.Value.ToString() : "";
                else
                    Common.RegisterStartupScript(this, "alert('Error :  You are unauthorized to respond to this message.');");
            }
        }
    
        public string SendToSubject
        {
            set
            {
                tbSubject.Text = "RE: " + value;
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            lblMessageSentText.Visible = false;
        }
    
        private static string SENTMESSAGETEXT = "Your message was sent at {0} to {1}.";
    
        protected void butSend_Click(object sender, EventArgs e)
        {
            Message m = new Message();
            m.Body = tbBody.Text;
            m.FromUserID = Common.CurrentUserID;
            m.IsRead = false;
            m.SentDate = DateTime.Now;
            m.Subject = tbSubject.Text;
            int tid;
            if (int.TryParse(ddlToUser.SelectedValue, out tid))
                m.ToUserID = tid;
            m.Save();
            lblMessageSentText.Text = string.Format(SENTMESSAGETEXT, DateTime.Now.ToString(), ddlToUser.SelectedItem.Text);
            lblMessageSentText.Visible = true;
    
            ddlToUser.SelectedValue = null;
            tbSubject.Text = "";
            tbBody.Text = "";
    
            if (this.MessageSent != null)
                MessageSent(this, new EventArgs());
        }
    }
    

    消息视图.ascx

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageView.ascx.cs" Inherits="UserControls_Messages_MessageView_MessageView" %>
    <asp:HiddenField ID="hfMessageID" runat="server" />
    <div style="border-style: solid;">
        <div style="font-size: x-large; padding: 10px 10px 10px 10px;">
            <asp:Label ID="lblSubject" runat="server" Text='<%# Bind("Subject") %>' /></div>
        <div style="background-color: lightblue;">
            <table>
                <tr>
                    <td>
                        <asp:Label ID="Label1" runat="server" Text="From :" />
                    </td>
                    <td>
                        <asp:Label ID="lblFromUser" runat="server" Text='<%# Bind("FromUser") %>' />
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:Label ID="Label2" runat="server" Text="To :" />
                    </td>
                    <td>
                        <asp:Label ID="lblToUser" runat="server" Text='<%# Bind("ToUser") %>' />
                    </td>
                </tr>
                <tr>
                    <td>
                        <asp:Label ID="Label3" runat="server" Text="Sent :" />
                    </td>
                    <td>
                        <asp:Label ID="lblSentDate" runat="server" Text='<%# Bind("SentDate") %>' />
                    </td>
                </tr>
            </table>
        </div>
        <div style="padding: 10px 10px 10px 10px">
            <asp:Label ID="lblBody" runat="server" Text='<%# Bind("Body") %>' />
        </div>
        <div style="padding: 10px 10px 10px 10px">
            <asp:LinkButton ID="lbReply" runat="server" Text="Reply" 
                onclick="lbReply_Click" /></div>
    </div>
    

    消息视图.ascx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class UserControls_Messages_MessageView_MessageView : System.Web.UI.UserControl
    {
        public event ComposeMessageEventHandler ComposeMessage;
        public delegate void ComposeMessageEventHandler(object sender, Common.MessageComposeEventArgs e);
    
        public int? MessageID
        {
            get
            {
                int mid;
                return int.TryParse(hfMessageID.Value, out mid) ? mid : new int?();
            }
            set
            {
                hfMessageID.Value = (value.HasValue) ? value.ToString() : "";
                BindMessageView();
            }
        }
    
        private void BindMessageView()
        {
            if (MessageID.HasValue)
            {
                CustomDataViews.MessageQuery.Message message = new CustomDataViews.MessageQuery().GetMessage(MessageID.Value);
    
                this.Visible = true;
                lblBody.Text = message.Body;
                lblFromUser.Text = message.FromUser;
                lblSentDate.Text = message.SentDate.ToString();
                lblSubject.Text = message.Subject;
                lblToUser.Text = message.ToUser;
            }
            else
            {
                this.Visible = false;
                lblBody.Text = "";
                lblFromUser.Text = "";
                lblSentDate.Text = "";
                lblSubject.Text = "";
                lblToUser.Text = "";
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
        protected void lbReply_Click(object sender, EventArgs e)
        {
            var mess = (from m in new VAC.Data.VACDB().Messages where m.MessageID == MessageID select m);
            if (mess.Count() == 1)
            {
                if (this.ComposeMessage != null)
                    this.ComposeMessage(this, new Common.MessageComposeEventArgs(mess.First().FromUserID, mess.First().Subject));
            }
        }
    }
    

    消息框

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="MessageBox.ascx.cs" Inherits="UserControls_Messages_MessageBox_MessageBox" %>
    <asp:UpdatePanel ID="up1" runat="server">
        <ContentTemplate>
            <h1>
                Message Inbox</h1>
            <cc:MessageFolder ID="mf1" runat="server" MailType="ReceivedMail" OnSelectedIndexChanged="SelectedMessageChanged"
                OnComposeMessage="ComposeMessage" />
            <h2>
                Sent Messages</h2>
            <cc:MessageFolder ID="mf2" runat="server" MailType="SentMail" OnSelectedIndexChanged="SelectedMessageChanged" />
            <br />
            <cc:MessageView ID="mv1" runat="server" OnComposeMessage="ComposeMessage" />
            <br />
            <cc:MessageCompose ID="mc1" runat="server" OnMessageSent="mc1_MessageSent" />
        </ContentTemplate>
    </asp:UpdatePanel>
    

    消息框.ascx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class UserControls_Messages_MessageBox_MessageBox : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                mv1.MessageID = mf1.MessageID;
                mc1.Visible = false;
            }
        }
    
        protected void SelectedMessageChanged(object sender, EventArgs e)
        {
            mv1.MessageID = ((IMessageFolder)sender).MessageID;
            mc1.Visible = false;
        }
    
        protected void ComposeMessage(object sender, Common.MessageComposeEventArgs e)
        {
            mc1.Visible = true;
            mc1.DataBind();
            if (e.SendToUserID.HasValue)
                mc1.SendToUserID = e.SendToUserID;
            if (!string.IsNullOrEmpty(e.Subject))
                mc1.SendToSubject = e.Subject;
        }
    
        protected void mc1_MessageSent(object sender, EventArgs e)
        {
            mf2.Refresh();
        }
    }
    

    ASPX

    <%@ Page Title="" Language="C#" MasterPageFile="~/Templates/Patient.master" AutoEventWireup="true"
        CodeFile="Messages.aspx.cs" Inherits="UI_Patient_Messages" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        <cc:MessageBox ID="mi1" runat="server" />
    </asp:Content>
    

    消息.aspx.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class UI_Patient_Messages : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
    
        2
  •  0
  •   Steve Danner    15 年前

    如果你愿意出一些钱, Telerik 有一个美好的 PanelBar 控件的外观与Outlook类似。我相信它附带的示例与他们站点上的类似于Outlook的演示应用程序是相同的,因此这可能是一种非常快速和简单的入门方法。

        3
  •  0
  •   Gan    15 年前

    史蒂夫·丹纳:

    Telerik有一个很好的panelbar控件,看起来就像Outlook。我相信它附带的示例与他们站点上的类似于Outlook的演示应用程序是相同的,因此这可能是一种非常快速和简单的入门方法。

    仅供参考,panelbar控件只是一个用户界面,它不提供消息传递功能。当然,您可以使用它使您的邮件系统看起来像Outlook,但是您仍然需要自己进行编码。

    推荐文章