65.9K
CodeProject 正在变化。 阅读更多。
Home

带 WCF 服务和子窗口作为弹出窗口的 Silverlight 应用程序 - 第二部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2011 年 5 月 13 日

CPOL

3分钟阅读

viewsIcon

21959

downloadIcon

722

会议日程 - 第二部分 - 保存到数据库并向所有联系人发送电子邮件。

介绍 

在第 1 部分中,我们完成了以下任务

  1. 使用 XAML 创建和设计主页和子窗口页面
  2. 创建 WCF 服务
  3. 在 Silverlight 应用程序中使用 WCF 服务
  4. 使用 WCF 服务从数据库中获取数据
  5. 在主页的弹出子窗口的 datagrid 中显示数据

第 2 部分的任务

在本部分中,主要工作区域如下

  1. 复选框问题
  2. 将子窗口中选定的联系人添加到只读联系人文本框
  3. 将会议安排保存到数据库中
  4. 向所有选定的联系人发送电子邮件,以获取会议信息

复选框问题

复选框的主要问题是 datagrid 标题复选框。最初,为最终用户从标题复选框到结尾提供全部选中和全部未选中是一个非常具有挑战性的工作,但后来它变得容易了。以下是此问题的代码。当标题复选框被选中时,所有复选框都应该被选中,相应的数据将被添加到列表泛型中,当未选中时,没有相应的数据被添加到列表泛型中。

添加以下命名空间以包含 observableCollection

using System.Collections.ObjectModel;

接下来,在全局定义两个 observableCollection 类型的变量,它们的类型是类类型。

public class newcontacts
{
    public string Fname { get; set; }
    public string Lname { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
}
ObservableCollection<newcontacts> allcontacts = new ObservableCollection<newcontacts>();
ObservableCollection<newcontacts> contactlist = new ObservableCollection<newcontacts>();

下面的方法用于在选中标题复选框时检查所有内容。

/// <summary>
/// header check box on click method
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void CheckBX_Click(object sender, RoutedEventArgs e)
{
    IsLoopNeeded = false;
    chk_header = sender as CheckBox;
    bool check = chk_header.IsChecked.Value;

    if (check)
    {
        foreach (newcontacts selectContacts in allcontacts)
        {
            chk_header = (CheckBox)dataGrid1.Columns[4].GetCellContent(selectContacts);
            if (chk_header.IsChecked != true)
            {
                chk_header.IsChecked = true;
            }
        }
        //In this case all contacts will be returned, 
        //so no need to change in allContacts list.
        IsContactPresent = true;
    }
    else
    {
        foreach (newcontacts selectContacts in allcontacts)
        {
            chk_header = (CheckBox)dataGrid1.Columns[4].GetCellContent(selectContacts);
            if (chk_header.IsChecked != false)
            {
                chk_header.IsChecked = false;
            }
        }
        //In this case no Contact will be returned, so either initialize a bool variable 
        //to false or empty allContacts list. First option looks good :)
        IsContactPresent = false;
    }
}

如果选中了各个复选框,则使用以下方法,当选中复选框时,将记录添加到列表中,或者当取消选中复选框时,将其删除。

void cell_chk_Click(object sender, RoutedEventArgs e)
{
    CheckBox chk = sender as CheckBox;
    bool check = chk.IsChecked.Value;
    IsLoopNeeded = true;
    newcontacts contacts = chk.DataContext as newcontacts;
    if (check)
    {
        if (!contactlist.Contains(contacts))
        {
            contactlist.Add(contacts);
        }
    }
    else
    {
         contactlist.Remove(contacts);
    }
}

将选定的联系人从子窗口添加到主页文本框

这是此应用程序中最棘手的部分,消耗了大部分时间。我不知道如何将记录添加到已选中的其他页面。我尝试了许多方法和逻辑,但这些方法和逻辑不如这个。我认为与使用 DelegateEventHandler 的其他方法相比,这非常好而且很快。只有在单击确定按钮时,才会从子窗口添加记录,而不是取消或关闭窗口。

但是对于此任务,我使用了参数化构造函数。使用主类构造函数来执行此操作比上述两种方法快得多。因此,下面是实现此目的的代码。

主页代码行

创建 private string 类型的 static 变量,用于存储我们从子窗口获取的联系人。

 private static String Contacts = "";

现在创建主类的构造函数,该构造函数从子窗口获取联系人并将其保存在 static 变量中。主页默认构造函数中定义的所有方法和变量都应包含在此构造函数中。这也 也很重要。

/// <summary>
/// Parametrized constructor
/// </summary> Created by Balwant
/// <param name="contactlist"></param>
public MainPage(string contactlist)
{
    InitializeComponent();
    Contacts = contactlist;
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    timeStart.ValueChanged +=
    new RoutedPropertyChangedEventHandler<DateTime?>(timeStart_ValueChanged);
}
//Popup myPopUp;
/// <summary>
/// Default Constructor
/// </summary>
public MainPage()
{
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);
    timeStart.ValueChanged +=
    new RoutedPropertyChangedEventHandler<DateTime?>(timeStart_ValueChanged);
} 

现在,在关闭弹出窗口(子窗口)时,将所有这些联系人添加到只读文本框以获取联系人。

/// <summary>
/// Show pop up on this button click
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
    Popup  myPopUp = new Popup();
    myPopUp.Show();
    myPopUp.Closed += new EventHandler(myPopUp_Closed);
}
/// <summary>
/// pop up close event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void myPopUp_Closed(object sender, EventArgs e)
{
    txtContacts.Text = Contacts;
    // throw new NotImplementedException();
} 

子窗口代码

现在,在子窗口 CS 代码文件中,当单击确定按钮时,我们必须将所有选定的联系人发送到主页。

//These bool type variable is use to get the checkboxes status.
bool IsLoopNeeded = false;
bool IsContactPresent = true;
CheckBox chk_header;
private String _returnContactList = "";
public String returnContactList
{
    get
    {
        return _returnContactList;
    }
    set
    {
        _returnContactList = value;
    }
}

在子窗口关闭事件上,执行以下代码

void Popup_Closed(object sender, EventArgs e)
{
    if (this.DialogResult.Value == true)
    {
        if (IsLoopNeeded == false && IsContactPresent == true)
        {
            //*Please insert less then sign instead of $ for loops
            for (int i = 0;i $ allcontacts.Count; i++)
            {
                _returnContactList += allcontacts[i].Email.ToString() + ";";
            }
        }
        else if (IsLoopNeeded == false && IsContactPresent == false)
        {
            _returnContactList = "";
        }        
        else if (IsLoopNeeded == true)
        {
            //foreach (var contact in contactlist)
            //{
            //    chk_header = (CheckBox)dataGrid1.Columns[4].GetCellContent(contact);
            //if (chk_header.IsChecked == true)
            //{
            for(int i=0;i $ contactlist.Count;i++)
                _returnContactList += contactlist[i].Fname.ToString() + ";";
            //    }
          //}
        }
        //main page constructor is called here.
        MainPage obj = new MainPage(returnContactList);
    } 
    //   throw new NotImplementedException();
}

以下屏幕截图显示了从子窗口检索到的数据,显示在只读文本框中。

将会议信息保存到数据库中并发送邮件

现在我们可以再次使用 WCF 服务将数据保存到数据库中。以下是用于保存记录的 WCF 代码和用于调用 WCF 方法的主页代码。

[OperationContract]
public string saveSchedule(string agenda, string location, 
	DateTime StartTime, DateTime EndTime, string contacts, string details)
{
    SqlConnection con = new SqlConnection();
    con.ConnectionString = WebConfigurationManager.ConnectionStrings
			["ConnectionString"].ConnectionString;
    SqlCommand cmd = new SqlCommand();
    con.Open();
    cmd.Connection = con;
    cmd.CommandText = "insert into Meeting values
	(@Title,@Location,@StartTime,@EndTime,@Contact,@Details,@CreatedDate)";
    cmd.Parameters.AddWithValue("@Title", agenda);
    cmd.Parameters.AddWithValue("@Location", location);
    cmd.Parameters.AddWithValue("@StartTime", StartTime);
    cmd.Parameters.AddWithValue("@EndTime", EndTime);
    cmd.Parameters.AddWithValue("@Contact", contacts);
    cmd.Parameters.AddWithValue("@Details", details);
    cmd.Parameters.AddWithValue("@CreatedDate", System.DateTime.Now);
    cmd.ExecuteNonQuery();
    return "Record is saved successfully, Thanks for submitting schedule for meeting.";
}
/// <summary>
/// This method is used to send email to all selected contacts 
///regarding meeting schedule.
/// </summary> By Balwant
/// <param name="agenda"></param>
/// <param name="Location"></param>
/// <param name="contacts"></param>
/// <param name="details"></param>
/// <returns></returns>
[OperationContract]
public string sendmail(string agenda, string Location, string contacts, string details)
{
    try
    {
         SmtpClient smtpClient = new SmtpClient();
         MailMessage objMail = new MailMessage();
         MailAddress objMail_fromAddress= new MailAddress("bablu909@gmail.com");
         MailAddress objMail_toAddress= new MailAddress(contacts);
         objMail.IsBodyHtml=true;
         objMail.From=objMail_fromAddress;
         objMail.To.Add(objMail_toAddress);
         objMail.Subject=agenda+"<br>";
         objMail.Body=" "+ details + " Location:-" +Location+ "";
         objMail.Priority=MailPriority.High;
         smtpClient.Credentials= new System.Net.NetworkCredential
				("bablu909@gmail.com","123balwant");
         smtpClient.EnableSsl=true;
         smtpClient.Send(objMail);
         return "An Email is send to all recipients for the meeting schedule";
     }
     catch (Exception ex)
     {
         return "Error Sending Email Please Try again" +ex;
     }
}

主页代码,用于在主页中调用 WCF 方法并传递参数。

private void btSchedule_Click(object sender, RoutedEventArgs e)
{
    DateTime start = Convert.ToDateTime(dateStart.Text +" " + 
			timeStart.Value.Value.TimeOfDay);
    DateTime end = Convert.ToDateTime(dateEnd.Text +" " + timeEnd.Value.Value.TimeOfDay);
    ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
    client.saveScheduleAsync
    (txtAgenda.Text,txtLocation.Text,start,end,txtContacts.Text,txtDetails.Text);
    client.saveScheduleCompleted +=
    new EventHandler<saveScheduleCompletedEventArgs>(client_saveScheduleCompleted);
    client.sendmailAsync(txtAgenda.Text,txtLocation.Text,
			txtContacts.Text,txtDetails.Text);
    client.sendmailCompleted +=
    new EventHandler<sendmailCompletedEventArgs>(client_sendmailCompleted);
}
void client_saveScheduleCompleted(object sender, saveScheduleCompletedEventArgs e)
{
    lblMessage.Content = e.Result;
    //throw new NotImplementedException();
}
void client_sendmailCompleted(object sender, sendmailCompletedEventArgs e)
{
    lblMessage.Content += e.Result;
    //throw new NotImplementedException();
}

注意

此应用程序的完整源代码和数据库脚本可以在下载链接中找到。如果您发现需要更改或更新本文或上一篇文章,请告知我。只有在您阅读了第 1 部分后,本文才算完整。

感谢您,请提供反馈,以便我提高质量并发布更多文章。

© . All rights reserved.