0

したがって、データグリッドを使用する WPF アプリケーションがあります。Datagrid は、カスタム タイプ アイテムの BindingList にバインドされます。しかし、リストに新しいアイテムを追加すると、次のような例外が発生します。

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

XAML:

<Window x:Class="DoctorApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"
        Closed="Window_Closed">
    <DataGrid AutoGenerateColumns="True" 
            Height="184" HorizontalAlignment="Left" Margin="12,12,0,0" 
            Name="dataGrid1" VerticalAlignment="Top" Width="479" 
            ItemsSource="{Binding}" />

ウィンドウのコード:

public BindingList<Patient> tableData;
public List<CompositeType> ntfList;
Listener listener;

public MainWindow()
{
    InitializeComponent();
    tableData = new BindingList<Patient>()
    {                
    };

    //Bind the DataGrid to the customer data
    dataGrid1.DataContext= tableData;

    dataGrid1.AutoGeneratedColumns += (a, b) =>
    {       
        try
        {
            dataGrid1.Columns.RemoveAt(0); //the place where exception appears
        }
        catch (Exception ex)
        {
        }
        dataGrid1.Columns.RemoveAt(1);
        dataGrid1.Columns.RemoveAt(2);
    };
    ntfList = new List<CompositeType>();
    dataGrid1.MouseDoubleClick += (a, b) => OpenPatientWindow();
    button1.Click += (a, b) => OpenPatientWindow();            
}

新しいデータが追加される場所:

public void OnMessageAdded(CompositeType message)
{
    if (((message as CompositeType).formTitle.Equals("Informing Doctor")) || ((message as CompositeType).formTitle.Equals("Informing about end therapy")))
    {
        Patient p = (message as CompositeType).patient;
        // (mainWindow as MainWindow).dataGrid1.
        (mainWindow as MainWindow).tableData.Add(p);
        (mainWindow as MainWindow).ntfList.Add(message as CompositeType);
        (mainWindow as MainWindow).dataGrid1.Items.Refresh();
    }
}

コールバック関数 OnMessageAdded を介して WCF サービスからリストの新しいデータを取得しますが、サービスから取得したデータはまったく問題ありません。

そして、私が使用するカスタムクラス:

[Serializable]
public class Patient
{
    [DataMember]
    public String PatientId;   
    [DataMember]
    public String Surname;    
    [DataMember]
    public String Name;        
    [DataMember]
    public String Patronymic;       
    [DataMember]
    public String Adress;            
    [DataMember]
    public String Phone;            
    [DataMember]
    public String Birthday;     
    [DataMember]
    public String Diagnosis;  
    [DataMember]
    public String State;          
    [DataMember]
    public String TherapyStart;           
    [DataMember]
    public String TherapyEnd;
}

それが機能しない理由はありますか?

編集:私は同様のプロジェクトで、患者オブジェクトは次のように表示されます:

私のプロジェクトでは、次のようになります。

これは問題だと思いますが、それが何を意味するのかわかりません。

4

0 に答える 0