1

リストビュー サブアイテムにアクセスしようとしています。このプログラムは値の型が異なる複数のデータベースにアクセスするため、この ListView/GridView に列を動的に挿入する必要があります。必要に応じて、データベース検索を複数のタブに分割することもできますが、使いやすさを考えると、この方法は避けたいと思います。

私は解決策を約3〜4日探していました。このクラスは、OleDB クエリからのサブアイテム データを編成します。ここに私が使用しているコードのスニペットがあります:

    public class Repair
    {
        public string RP { get; set; }
        public string SN { get; set; }
        public DateTime REC { get; set; }
        public DateTime START { get; set; }
        public string CUST { get; set; }
        public string SP { get; set; }
        public string TECH { get; set; }
        public string STATUS { get; set; }
        public string MODEL { get; set; }
        public string NOTES { get; set; }
        public DateTime ACCUSED { get; set; }
        public string ACCNOTES { get; set; }
        public int ID { get; set; }
    }
    public IList<Repair> OpenRepair { get; set; }

次に、次のスニペットを使用して ListView にデータを挿入します。

var gridView = new GridView();
this.searchListView.View = gridView;
gridView.Columns.Add(new GridViewColumn { Header = "RMA #", DisplayMemberBinding = new System.Windows.Data.Binding("RP") });
gridView.Columns.Add(new GridViewColumn { Header = "Serial", DisplayMemberBinding = new System.Windows.Data.Binding("SN") });
gridView.Columns.Add(new GridViewColumn { Header = "Recieved", DisplayMemberBinding = new System.Windows.Data.Binding("REC") });
gridView.Columns.Add(new GridViewColumn { Header = "Start", DisplayMemberBinding = new System.Windows.Data.Binding("START") });
gridView.Columns.Add(new GridViewColumn { Header = "Customer", DisplayMemberBinding = new System.Windows.Data.Binding("CUST") });
gridView.Columns.Add(new GridViewColumn { Header = "Sales Person", DisplayMemberBinding = new System.Windows.Data.Binding("SP") });
gridView.Columns.Add(new GridViewColumn { Header = "Technician", DisplayMemberBinding = new System.Windows.Data.Binding("TECH") });
gridView.Columns.Add(new GridViewColumn { Header = "Status", DisplayMemberBinding = new System.Windows.Data.Binding("STATUS") });
gridView.Columns.Add(new GridViewColumn { Header = "Repair Notes", DisplayMemberBinding = new System.Windows.Data.Binding("NOTES") });
gridView.Columns.Add(new GridViewColumn { Header = "Accidental Used Date", DisplayMemberBinding = new System.Windows.Data.Binding("ACCUSED") });
gridView.Columns.Add(new GridViewColumn { Header = "Accidental Notes", DisplayMemberBinding = new System.Windows.Data.Binding("ACCNOTES") });
gridView.Columns.Add(new GridViewColumn { Header = "ID", DisplayMemberBinding = new System.Windows.Data.Binding("ID"), Width = 0 });
using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=X:\***"))
{
    cmd.Connection = cn;
    cmd.CommandText = sqlstatement;
    try
    {
         cn.Open();
         dr = cmd.ExecuteReader();
         if (dr.HasRows)
         {
             while (dr.Read())
             {
                  OpenRepair = new List<Repair>();
                  if (dr[10].ToString() == "True")
                  {
                        OpenRepair.Add(
                        new Repair()
                        {
                           RP = dr[0].ToString(),
                           SN = dr[1].ToString(),
                           REC = Convert.ToDateTime(dr[2].ToString()).Date,
                           START = Convert.ToDateTime(dr[3].ToString()).Date,
                           CUST = dr[4].ToString(),
                           SP = dr[5].ToString(),
                           TECH = dr[6].ToString(),
                           STATUS = dr[7].ToString(),
                           MODEL = dr[8].ToString(),
                           NOTES = dr[9].ToString(),
                           ACCUSED = Convert.ToDateTime(dr[11].ToString()),
                           ACCNOTES = dr[12].ToString(),
                           ID = Convert.ToInt32(dr[13].ToString())
                        });
                    }
                    else
                    {
                         OpenRepair.Add(
                         new Repair()
                         {
                             RP = dr[0].ToString(),
                             SN = dr[1].ToString(),
                             REC = Convert.ToDateTime(dr[2].ToString()).Date,
                             START = Convert.ToDateTime(dr[3].ToString()).Date,
                             CUST = dr[4].ToString(),
                             SP = dr[5].ToString(),
                             TECH = dr[6].ToString(),
                             STATUS = dr[7].ToString(),
                             MODEL = dr[8].ToString(),
                             NOTES = dr[9].ToString(),
                             ID = Convert.ToInt32(dr[13].ToString())
                          });
                      }
                  searchListView.Items.Add(OpenRepair);
               }

ListView の背後にある XAML:

<ListView ItemsSource="{Binding Repair}" SelectionMode="Single" x:Name="searchListView" Margin="0,63,0,0" Background="DarkGray" MouseDoubleClick="searchListView_MouseDoubleClick">
                    <ListView.View>
                        <GridView />
                    </ListView.View>
                </ListView>

いくつかの方法で、ListView/GridView 内の Subitem 値を取得しようとしました。次のコードのいずれでも成功していません。

                Repair lvi = (Repair)searchListView.SelectedItems[0];
                System.Windows.MessageBox.Show(lvi.RP + " " + lvi.SN + " " + lvi.SP);

&

          Repair lvi = (Repair)this.customersListView.SelectedItem;
          MessageBox.Show(string.Format("Repair: {1}{0}Serial Number:{2}", Environment.NewLine, lvi.RP, lvi.SN));

Windows フォームのアプローチを試みましたが、明らかにうまくいきませんでした。

誰かが少なくとも私を正しい方向に向けてもらえますか? 私が取得しているエラー メッセージは、オブジェクト Generic List からクラス Repair にキャストできないため、理にかなっていますが、私は WPF にかなり慣れていないため、このメッセージを渡す方法に困惑しています!

4

2 に答える 2

1

私はあなたのコードをテストしましたが、それは私にとってはうまくいくので、表示されていない部分に間違いがある可能性があります. しかし、MVVM パターンを使用することであなたを納得させようとしましょう。長い目で見れば、あなたの生活はずっと楽になります...

ViewModel とあなたの Repair クラス (文字列の DateTime を交換):

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1.Models
{
    public class ListViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public ObservableCollection<Repair> Repairs { get; private set; }
        public ActionCommand DoubleClickCommand { get; private set; }

        private Repair _selectedRepair;
        public Repair SelectedRepair { get { return _selectedRepair; } set { _selectedRepair = value; OnPropertyChanged("SelectedRepair"); } }

        public ListViewModel()
        {
            this.Repairs = new ObservableCollection<Repair>();
            this.Repairs.Add(new Repair { RP = "1000", SN = "A", START = DateTime.Today.ToString("d"), CUST = "C", ID = 0 });
            this.Repairs.Add(new Repair { RP = "2000", SN = "D", REC = DateTime.Today.AddDays(-2).ToString("d"), CUST = "E", ID = 1 });

            this.DoubleClickCommand = new ActionCommand(DoubleClick);
        }

        private void DoubleClick()
        {
            // do whatever (probably not show a MessageBox..)
            MessageBox.Show(string.Format("Repair: {1}{0}Serial Number:{2}", Environment.NewLine, this.SelectedRepair.RP, this.SelectedRepair.SN));
        }
    }

    public class ActionCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;
        private Action _action;
        public ActionCommand(Action action) { _action = action; }
        public bool CanExecute(object parameter) { return true; }
        public void Execute(object parameter) { if (_action != null) _action(); }
    }

    public class Repair
    {
        public string RP { get; set; }
        public string SN { get; set; }
        public string REC { get; set; }
        public string START { get; set; }
        public string CUST { get; set; }
        public string SP { get; set; }
        public string TECH { get; set; }
        public string STATUS { get; set; }
        public string MODEL { get; set; }
        public string NOTES { get; set; }
        public string ACCUSED { get; set; }
        public string ACCNOTES { get; set; }
        public int ID { get; set; }
    }
}

景色:

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:models="clr-namespace:WpfApplication1.Models"  
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        Title="MainWindow" Height="350" Width="500">
    <Window.DataContext>
        <models:ListViewModel />
    </Window.DataContext>
    <ListView ItemsSource="{Binding Repairs}" SelectedItem="{Binding SelectedRepair}" SelectionMode="Single" Margin="0,63,0,0" Background="DarkGray">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding DoubleClickCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="RMA #" DisplayMemberBinding="{Binding RP}" />
                <GridViewColumn Header="Serial" DisplayMemberBinding="{Binding SN}"/>
                <GridViewColumn Header="Recieved" DisplayMemberBinding="{Binding REC}"/>
                <GridViewColumn Header="Start" DisplayMemberBinding="{Binding START}"/>
                <GridViewColumn Header="Customer" DisplayMemberBinding="{Binding CUST}"/>
                <GridViewColumn Header="Sales Person" DisplayMemberBinding="{Binding SP}"/>
                <GridViewColumn Header="Technician" DisplayMemberBinding="{Binding TECH}"/>
                <GridViewColumn Header="Status" DisplayMemberBinding="{Binding STATUS}"/>
                <GridViewColumn Header="Repair Notes" DisplayMemberBinding="{Binding NOTES}"/>
                <GridViewColumn Header="Accidental Used Date" DisplayMemberBinding="{Binding ACCUSED}"/>
                <GridViewColumn Header="Accidental Notes" DisplayMemberBinding="{Binding ACCNOTES}"/>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="0" />
            </GridView>
        </ListView.View>
    </ListView>
</Window>
于 2014-09-10T20:38:59.570 に答える