リストビュー サブアイテムにアクセスしようとしています。このプログラムは値の型が異なる複数のデータベースにアクセスするため、この 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 にかなり慣れていないため、このメッセージを渡す方法に困惑しています!