Как я могу показать оба данные с двумя статусами, используя c#

#c# #.net #mysql #windows #winforms

#c# #.net #mysql #Windows #winforms

Вопрос:

У меня есть форма, в которой у меня есть пользовательский контроль (для отображения имени участника с указанием даты и времени) и два списка со списком (один — значения cbstatus, такие как (отказано, принимает, выход из системы), а другой — список cbperiod и такие значения, как (сегодня, 7 дней, 30 дней ..) Я показываю имя участника вместе с датой посещения и датой выхода из системы следующим образом ..)

используя следующий запрос

   sql = @"SELECT member_Firstname, member_Lastname, member_Postcode,  
          visit_DateTime, visit_Status, visit_Logout_DateTime, visits.member_Id, visit_AlertMsg
          FROM members,visits
          WHERE members.member_Id = visits.member_Id
          AND members.member_Active LIKE 'y%'";
 

это работает нормально…..

Я получаю значения, зависящие от значений со списком, подобных этому..

  if (cbStatus.Text == "Accepts")
 {
    sql  = " AND visits.visit_Status = 'accepted' ";
 }
 

у меня есть еще два условия, подобные этому…

   if (cbStatus.Text == "refusals")
 {
    sql  = blahh blahh blahhhh
 }
 

я получаю значения для выбора cbperiod combobox следующим образом…

   if (cbPeriod.Text == "Today")
  {
    string dtStartString = DateTime.Today.ToString(DataHelper.dateFormat);

    sql  = string.Format(" AND visits.visit_Date = '{0}'", dtStartString);
  }
//here i am comparing the cbstatus value logout and cbperiod text with today to get the member details whose logout datetime is today

  if (cbStatus.Text == "Logout" amp;amp; cbPeriod.Text == "Today")
  {
    string dtStartString = DateTime.Today.ToString("yyyy-MM-dd");            
    sql  = string.Format(" AND DATE(visits.visit_Logout_DateTime) = '{0}'", dtStartString);

  }
 

и у меня есть еще два условия, подобные этому …. для значений в cbstatus и cbperiod

здесь я связываю свои значения с помощью usercontrol….

  datatable dt1 =  Helper.GetData(sql);


  if (dt1 != null)
  {
    if (dt1.Rows.Count > 0)
    {         
      foreach (DataRow row in dt1.Rows)
      {
        newItem = new EntryItem();// this is my usercontrol        
        if (cbStatus.Text != "Logout")
        {
          DateTime dtTemp = DateTime.Parse(row["visit_DateTime"].ToString()); // here I    am showing the data when user not selected the cbstatus text as logout I mean (refusal,..)
   but the below function overrides this data ....
          if (cbPeriod.Text == "Today") newItem.lblTime.Text = dtTemp.ToString("HH':'mm':'ss");
          else newItem.lblTime.Text = dtTemp.ToString("yyyy'-'MM'-'dd'  -  'HH':'mm':'ss");
        }

        if (row["visit_Logout_DateTime"] != DBNull.Value)
        {
          DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());
          if (dtlogout != null)
          {
            if (cbStatus.Text == "Logout" amp;amp; cbPeriod.Text == "Today")
            {
              newItem.lblTime.Text = dtlogout.ToString("HH':'mm':'ss");
              newItem.lblName.Text = row["member_Firstname"].ToString()   " "   row["member_Lastname"].ToString();
              newItem.lblAlertMessage.Text =  row["visit_AlertMsg"].ToString();

            }
            else
              newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd'  -  'HH':'mm':'ss");
            newItem.lblName.Text = row["member_Firstname"].ToString()   " "   row["member_Lastname"].ToString();
            newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();               
          }
        }

     newItem.lblName.Text = row["member_Firstname"].ToString()   " "   row["member_Lastname"].ToString();
        newItem.lblAlertMessage.Text =  row["visit_AlertMsg"].ToString();
 

когда я выберу cbstatus.text == logout , он покажет правильные данные с участниками с датой выхода из системы…

но когда я выбираю cbstatus.text == refusals .. он показывал данные выхода из системы (участники с logoutdaatetime) .. это неправильно, на самом деле он должен показывать refusal members с visit_Datetime

как я могу показать оба данные с членами, имеющими logoutdatetime и дату посещения

Примечание: у одного участника есть как logoutdatetime, так и visitdatetime….

и мои данные выглядят так…

   firstname     lastname   postcode   status        visit_Logout_DateTime        visit_datetime
-------------  --------   ---------   -------        ---------------------    ----------------
 rob           peter     hhd344h      refused          2011-05-06 12:09:07     2011-05-06 08:09:34                          
peter          chan      hy78kjk      refused          2011-09-08 12:09:08     2011-05-03 06:09:34
 rock         sam        yudufg3746h  refused          2011-08-08 09:08:45    
 rob           peter     hhd344h      refused          2011-05-10 12:09:07     2011-05-10 08:09:34      
 

Комментарии:

1. кто-нибудь, пожалуйста, поможет в этом …. и, пожалуйста, сообщите мне, если приведенный выше вопрос неясен…

2. Я бы упростил код и использовал хранимые процедуры, у вас много динамического SQL.

3. но я не могу использовать здесь процедуры хранения…..

Ответ №1:

Используйте оператор case в sql. Смотрите следующий пример

 sql = @"SELECT member_Firstname, member_Lastname, member_Postcode,             visit_DateTime, visit_Status, visit_Logout_DateTime, visits.member_Id, visit_AlertMsg , CustomDateColumn = CASE  visit_Status
WHEN 'refused' THEN   visit_Datetime
WHEN 'Logout' THEN  visit_Logout_DateTime
WHEN ....
End
FROM members,visits           WHERE members.member_Id = visits.member_Id           AND members.member_Active LIKE 'y%'"; 
 

Ответ №2:

Я думаю, вам могут не хватать некоторых скобок вокруг оператора else, который выглядит следующим образом:

 else
    newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd'  -  'HH':'mm':'ss");
newItem.lblName.Text = row["member_Firstname"].ToString()   " "   row["member_Lastname"].ToString();
newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();
 

Кроме того, похоже, что первая строка этого блока может быть ответом на вашу проблему. Вы меняете метку на время выхода из системы. Возможно, вы действительно хотите использовать время «посещения»?

Ответ №3:

Я решил свою проблему … вот так….

         if (row["visit_Logout_DateTime"] != DBNull.Value || row["visit_DateTime"] == DBNull.Value)
        {
          if (cbStatus.Text != "Refusals" amp;amp; cbStatus.Text != "Accepts" amp;amp; row["visit_Logout_DateTime"] != DBNull.Value)
          {
            DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());

            if (true)
            {
              if (cbPeriod.Text == "Today")
              {
                newItem.lblTime.Text = dtlogout.ToString("HH:mm:ss");
                newItem.BackColor = Color.Cyan;
              }
              else
                newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd'  -  'HH':'mm':'ss");               
              newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
              newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());

              newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
              newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());              
              newItem.tbHiddenId.Text = row["member_Id"].ToString();
              newItem.ID = Convert.ToInt32(row["member_Id"].ToString());
            }
          }

        }
        else if (row["visit_Logout_DateTime"] == DBNull.Value || row["visit_DateTime"] != DBNull.Value)
        {
          DateTime dtTemp = DateTime.Parse(row["visit_DateTime"].ToString());
          newItem.lblTime.Text = dtTemp.ToString(cbPeriod.Text == "Today" ? "HH':'mm':'ss" : "yyyy'-'MM'-'dd'  -  'HH':'mm':'ss");

          newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
          newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());

          newItem.tbHiddenId.Text = row["member_Id"].ToString();
          newItem.ID = Convert.ToInt32(row["member_Id"].ToString());
        }