簡體   English   中英

讀取CSV文件在C# WPF

[英]Reading CSV file in C# WPF

我正在創建這個應用程序,以便在 C# 中進行更多練習,並讀寫 CSV 文件。 我想將 CSV 文件中的一些不同動物顯示到 WPF 中的數據網格中。我已經成功地在我的應用程序的一部分中使用完全相同的代碼來顯示來自不同 CSV 文件的動物類別,但是任何人都可以看到為什么這不會展示動物。 我已將我的代碼更改為不同的 CSV 位置,並添加到我想顯示的不同列中,但我無法弄清楚為什么這不起作用。

下面是我的數據網格部分用於顯示動物的代碼。

private void DataGridViewAnimals_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            Animal animal= new Animal();
            string[] AnimalArray;

            DataTable dt = new DataTable();
            dt.Columns.Add("Animal", typeof(string));

            using (StreamReader reader = new StreamReader(@"C:\Users\ashle\OneDrive\Documents\Uni\Level 5\Object Orientated Programming\Practical\CSV Files\animal.csv"))
            {
                while (!reader.EndOfStream)
                {
                    AnimalArray = reader.ReadLine().Split(',');

                    animal.Type = AnimalArray[0];
                    animal.Category = AnimalArray[1];
                    animal.Colour = AnimalArray[2];
                    animal.Origin = AnimalArray[3];

                    dt.Rows.Add(AnimalArray);
                }
                DataView dv = new DataView(dt);
                DataGridViewAnimals.ItemsSource = dv;
            }
        }

抱歉,我是 C# 和 WPF 的新手,所以任何人都可以看看是否有任何問題。 我曾嘗試尋找不同的方法來做到這一點,但我沒有運氣。 如果您需要更多信息,請詢問:) 謝謝

編輯:這是我的 DataGrid 代碼,它從我的 CSV 文件中提取數據

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            AnimalCategory animalCategory = new AnimalCategory();
            string[] CategoryArray;

            DataTable dt = new DataTable();
            dt.Columns.Add("Animal Category", typeof(string));

            using (StreamReader reader = new StreamReader(@"C:\Users\ashle\OneDrive\Documents\Uni\Level 5\Object Orientated Programming\Practical\CSV Files\animalcategory.csv"))
            {
                while (!reader.EndOfStream)
                {
                    CategoryArray = reader.ReadLine().Split(',');

                    animalCategory.Category = CategoryArray[0];

                    dt.Rows.Add(CategoryArray);
                }
                DataView dv = new DataView(dt);
                DataGridViewAnimalCategories.ItemsSource = dv;
            }
        }

下面顯示了我的 XAML UI 的第一段無效代碼的標記。

<Window x:Class="AnimalWatchersUnited2.Animals"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:AnimalWatchersUnited2"
        mc:Ignorable="d"
        Title="Animals" Height="450" Width="800" >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="1.1*"/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <Rectangle Fill="LightPink" Grid.Row="0" Grid.ColumnSpan="6"/>
        <Label Content="Animal Watchers United" FontSize="36" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.ColumnSpan="6" FontFamily="Candara" />
        <Button Click="ClickMainMenu" Content="Main Menu" Grid.Column="0" Grid.Row="1" Height="50px" Width="110px" Margin="10,0,12,50"/>
        <Button Click="ClickAnimalCategories" Content="Animal Categories" Grid.Column="1" Grid.Row="1" Height="50px" Width="110px" Margin="10,0,12,50"/>
        <Button Content="Animals" Grid.Column="2" Grid.Row="1" Height="50px" Width="110px" Margin="12,0,10,50"/>
        <Button Content="Sightings" Grid.Column="3" Grid.Row="1" Height="50px" Width="110px" Margin="12,0,10,50"/>
        <Button Content="Wishlist" Grid.Column="4" Grid.Row="1" Height="50px" Width="110px" Margin="12,0,10,50"/>
        <Button Click="ClickLogout" Content="Logout" Grid.Column="5" Grid.Row="1" Height="50px" Width="110px" Margin="10,0,10,50"/>


        <DataGrid Name="DataGridViewAnimals" Grid.Column="1" Grid.Row="2" RenderTransformOrigin="0.808,0.668" Grid.ColumnSpan="3" Grid.RowSpan="2" SelectionChanged="DataGridViewAnimals_SelectionChanged"/>
    </Grid>
</Window>

問題是您要將一組字符串添加到只有一列的網格中。 當您只有 1 列時,它沒有空間為每只動物添加 4 個項目。 如果我是正確的,你應該得到一個內部異常,說“輸入數組比這個表中的列數長”。

嘗試為 go 的值定義更多列,如下所示:

string[] AnimalArray;

DataTable dt = new DataTable();
dt.Columns.Add("Type", typeof(string));
dt.Columns.Add("Category", typeof(string));
dt.Columns.Add("Colour", typeof(string));
dt.Columns.Add("Origin", typeof(string));

using (StreamReader reader = new StreamReader(@"C:\Users\ashle\OneDrive\Documents\Uni\Level 5\Object Orientated Programming\Practical\CSV Files\animal.csv"))
{
    while (!reader.EndOfStream)
    {
        AnimalArray = reader.ReadLine().Split(',');

        dt.Rows.Add(AnimalArray);
    }
    DataView dv = new DataView(dt);
    DataGridViewAnimals.ItemsSource = dv;
}

如果這仍然不起作用,請向我們展示能與 xaml 標記一起工作的 UI 代碼。

編輯:正如 Fildor 所指出的,您沒有以這種方式使用動物變量,因此設置其屬性沒有意義,除非您想在其他地方使用數據。

編輯2:第二個問題在於事件本身。 WORKS 的代碼在方法 Window Loaded 中,我認為當加載 window 時將調用該方法。 這就是它起作用的原因。

另一方面,SelectionChanged 在選擇網格中的項目時被調用。 由於網格中還沒有數據,因此首先不能選擇任何項目來調用該方法。

換句話說,代碼的位置不正確。 只需從 UI 中的 DataGrid 中刪除 SelectionChanged 事件處理程序,並為其中一個按鈕(我猜是 Animals 按鈕)添加一個點擊方法,然后將代碼放在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM