2012-01-21 2 views
2

UserControl에 문제가 있습니다. 내가 프로그램을 시작할 때 "객체 참조가 객체의 인스턴스로 설정되지 않았습니다"라는 메시지가 나타납니다. "listView1.Items.Add (horario);"줄에 오류가 있습니다. 나는 정말로 무엇을해야할지 모른다. 아마 어리석은 문제 일지 모르지만 나는 그것을 발견 할 수 없다. 당신이 나를 도울 수? ItemsSource를 동적으로 및 xaml 방식으로 사용하려고 시도했지만 작동하지 않았습니다.ListView 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

<UserControl x:Class="Clipboard_final.Horas" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" Width="1258" Height="596"> 
<Grid Loaded="Grid_Loaded"> 
    <Label Content="Horários" Height="61" Name="label1" VerticalAlignment="Top" FontSize="40" Margin="0,-9,1090,0" /> 
    <Label Content="Cheque ou adicione novos horários realizados" Height="28" HorizontalAlignment="Left" Margin="29,40,0,0" Name="label2" VerticalAlignment="Top" /> 
    <Label Content="Label" Height="32" Margin="0,85,567,0" Name="label3" VerticalAlignment="Top" FontSize="15" FontStretch="Normal" HorizontalAlignment="Right" Width="520" /> 
    <Label Content="Entrou" Height="28" HorizontalAlignment="Left" Margin="183,132,0,0" Name="label4" VerticalAlignment="Top" /> 
    <Label Content="Saiu" Height="28" HorizontalAlignment="Left" Margin="188,166,0,0" Name="label5" VerticalAlignment="Top" /> 
    <Button Content="Enviar" Height="23" HorizontalAlignment="Left" Margin="219,543,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="228,135,0,0" Name="textBox1" VerticalAlignment="Top" Width="46" Text="00" /> 
    <Label Content=":" Height="28" HorizontalAlignment="Left" Margin="272,132,0,0" Name="label6" VerticalAlignment="Top" /> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="281,135,0,0" Name="textBox2" VerticalAlignment="Top" Width="46" Text="00" /> 
    <TextBox HorizontalAlignment="Left" Margin="228,168,0,0" Name="textBox3" Width="46" Height="23" VerticalAlignment="Top" Text="00" /> 
    <Label Content=":" Height="28" HorizontalAlignment="Left" Margin="272,166,0,0" Name="label7" VerticalAlignment="Top" /> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="281,168,0,0" Name="textBox4" VerticalAlignment="Top" Width="46" Text="00" /> 
    <TextBox Height="329" HorizontalAlignment="Left" Margin="78,208,0,0" Name="textBox5" VerticalAlignment="Top" Width="380" /> 
    <ListView Height="329" HorizontalAlignment="Left" Margin="709,208,0,0" Name="listView1" VerticalAlignment="Top" Width="480" SelectionChanged="listView1_SelectionChanged" SelectionMode="Single"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Entrou" Width="60" DisplayMemberBinding="{Binding hora_entrada}"/> 
       <GridViewColumn Header="Saiu" Width="50" DisplayMemberBinding="{Binding hora_saida}" /> 
       <GridViewColumn Header="Conferido" Width="65" DisplayMemberBinding="{Binding visto}"/> 
       <GridViewColumn Header="Descrição" Width="300" DisplayMemberBinding="{Binding descricao}"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Windows; 
    using System.Windows.Controls; 
    using System.Windows.Data; 
    using System.Windows.Documents; 
    using System.Windows.Input; 
    using System.Windows.Media; 
    using System.Windows.Media.Imaging; 
    using System.Windows.Navigation; 
    using System.Windows.Shapes; 
    using MySql.Data.MySqlClient; 
    using System.Windows.Controls; 
    using System.Collections.ObjectModel; 

    namespace Clipboard_final 
    { 

public class Horarios 
{ 
    public string hora_entrada{ get; set; } 
    public string hora_saida { get; set; } 
    public string visto { get; set; } 
    public string descricao { get; set; } 



} 
public partial class Horas : UserControl 
{ 
    private int id_user; 
    ObservableCollection<Horarios> _Horarios = 
    new ObservableCollection<Horarios>(); 
    public Horas(int _id_user) 
    { 

     id_user = _id_user; 
     MySqlConnection oi = new MySqlConnection(); 
     oi.ConnectionString = 
     "server=localhost;" 
     + "database=clipboard;" 
     + "uid=staff;" 
     + "password=clipboardstaff4thewin;"; 

     try 
     { 
      oi.Open(); 
      MySqlCommand comando = new MySqlCommand("SELECT horario_entrada,horario_saida,visto,descricao from horarios where ID_Estagiario = @id_user", oi); 
      comando.Parameters.Add("@id_user", MySqlDbType.Int32).Value = id_user; 
      MySqlDataReader leitor = comando.ExecuteReader(); 
      while (leitor.Read()) 
      { 

       Horarios horario = (new Horarios 
       { 
        hora_entrada = leitor.GetString(0), 
        hora_saida = leitor.GetString(1), 
        visto = (leitor.GetChar(0)).ToString(), 
        descricao = leitor.GetString(2) 
       }); 
       listView1.Items.Add(horario); 

      } 

      leitor.Close(); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show("Erro de conexão com o banco de dados. Erro " + ex.ToString()); 
     } 
     InitializeComponent(); 
     label3.Content = "Hoje é dia "+Convert.ToString(DateTime.Now.Day)+" do mês "+Convert.ToString(DateTime.Now.Month)+" de "+Convert.ToString(DateTime.Now.Year); 
    } 


    private void button1_Click(object sender, RoutedEventArgs e) 
    { 

     try 
     { 
      MySqlConnection oi = new MySqlConnection(); 
      oi.ConnectionString = 
      "server=localhost;" 
      + "database=clipboard;" 
      + "uid=staff;" 
      + "password=clipboardstaff4thewin;"; 
      try 
      { 
       oi.Open(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Erro de conexão com o banco de dados. Erro " + ex.ToString()); 
      } 
      if (textBox5.Text == "") 
      { 
       MessageBox.Show("Digite a descrição do dia"); 
      } 
      else 
      { 
       MySqlCommand comando = new MySqlCommand("Select id_estagiario from estagiario where id_funcao = @um", oi); 
       comando.Parameters.Add("@um", MySqlDbType.Int32).Value = 1; 
       MySqlDataReader leitor = comando.ExecuteReader(); 
       int chefe = 0; 
       while (leitor.Read()) 
       { 
        chefe = leitor.GetInt32(0); 
       } 
       leitor.Close(); 
       int horaentrada_inteiro = Convert.ToInt32(textBox1.Text); 
       int minutosentrada_inteiro = Convert.ToInt32(textBox2.Text); 
       int horasaida_inteiro = Convert.ToInt32(textBox3.Text); 
       int minutossaida_inteiro = Convert.ToInt32(textBox4.Text); 

       if (((horasaida_inteiro - horaentrada_inteiro) == 0 && (minutossaida_inteiro - minutosentrada_inteiro) <= 0) || horasaida_inteiro - horaentrada_inteiro < 0) 
       { 
        MessageBox.Show("Você digitou incorretamente os horários"); 
       } 
       if (horaentrada_inteiro < 13 || horasaida_inteiro > (DateTime.Now.Hour + 1)) 
       { 
        if (id_user != chefe) 
        { 
         MessageBox.Show("Ninguém trabalha nestes horários.", "Erro"); 
         MySqlCommand comando1 = new MySqlCommand("Select Nome from estagiario where id_estagiario = @id_user", oi); 
         comando1.Parameters.Add("@id_user", MySqlDbType.Int32).Value = id_user; 
         MySqlDataReader leitor1 = comando1.ExecuteReader(); 
         string nome = ""; 
         while (leitor1.Read()) 
         { 
          nome = leitor1.GetString(0); 
         } 
         leitor1.Close(); 
         leitor1.Close(); 
         comando1 = new MySqlCommand("Insert Into Recado values(0,@warn,0,'Clipboard SecuritySaver',@chefe)", oi); 
         comando1.Parameters.Add("@warn", MySqlDbType.VarChar).Value = "O estagiário " + nome + " tentou burlar o sistemas de horários."; 
         comando1.Parameters.Add("@chefe", MySqlDbType.Int32).Value = chefe; 
         comando1.ExecuteNonQuery(); 
        } 
        else 
        { 
         MessageBox.Show("Chefe querido, você digitou os horários incorretamente", "Erro"); 
        } 

       } 
       else 
       { 

        string data = Convert.ToString(DateTime.Now.Day) + '/' + Convert.ToString(DateTime.Now.Month) + '/' + Convert.ToString(DateTime.Now.Year); 
        string hora_entrada = Convert.ToString(horaentrada_inteiro) + ':' + minutosentrada_inteiro.ToString(); 
        string hora_saida = horasaida_inteiro.ToString() + ':' + minutossaida_inteiro.ToString(); 
        comando = new MySqlCommand("INSERT INTO HORARIOS VALUES (0,@data,@id_user,@hora_entrada,@hora_saida,@descricao,0)", oi); 
        comando.Parameters.Add("@data", MySqlDbType.VarChar).Value = data; 
        comando.Parameters.Add("@id_user", MySqlDbType.Int32).Value = id_user; 
        comando.Parameters.Add("@hora_entrada", MySqlDbType.VarChar).Value = hora_entrada; 
        comando.Parameters.Add("@hora_saida", MySqlDbType.VarChar).Value = hora_saida; 
        comando.Parameters.Add("@descricao", MySqlDbType.VarChar).Value = textBox5.Text; 
        comando.ExecuteNonQuery(); 
       } 
      } 
     } 


     catch (FormatException ex) 
     { 
      MessageBox.Show("Escreva somente números"); 
     } 

    } 

    private void listView1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

    } 



    private void Grid_Loaded(object sender, RoutedEventArgs e) 
    { 


    } 
} 

} 이상한 언어

+1

왜 ListView, DataGrid를 사용해 보셨습니까? – jcvegan

+4

InitializeComponent 뒤에 목록 항목을 추가하려면 코드를 이동해야합니다. [1] : http://stackoverflow.com/questions/245825/what-does-initializecomponent-do-and-how-does-it-work-wpf –

+0

너무 많은 코드 ... –

답변

0

그것은 listView1 변수가 null 것을 의미에 대한

죄송합니다. 자체적으로 초기화 될 때까지 항목을 목록보기에 추가 할 수 없습니다. 나는 listView1 변수가 폼의 생성자에서 자동으로 초기화되지만 사용자 컨트롤의 생성자가 그보다 더 빨리 호출된다고 가정합니다.

GUI 컨트롤을 해당 클래스의 생성자에서 초기화하려고하면 일반적으로 잘못된 디자인입니다. 나는 GUI 클래스의 생성자가 다른 GUI 객체를 사용하지 않아야한다는 것을 의미한다. 왜냐하면 생성자가 호출 될 때 이미 초기화되었다는 것을 확신 할 수 없기 때문이다.

2

양식 초기화 후 목록보기 항목을 호출하십시오.

관련 문제