2013-04-15 24 views
9

WinFormアプリケーション内にアドレスリストにバインドされたデータグリッドがあります。アドレスのリストは長いので、私は私が望むアドレスを選択するためにスクロールする必要があります。しかし、私がスクロールし、私が欲しいアドレスを見つけてそれを選択した後、データグリッドは、フォームが最初にロードされたときにグリッド上の同じ位置にあったアドレスを選択します。私は何が間違っているのか、そして私が望む結果を得る方法を考えていました。Datagridがスクロールした後に間違った行を選択しています

// 
// bindingSource1 
// 
    private System.Windows.Forms.BindingSource bindingSource1; 
    this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); 
this.bindingSource1.DataSource = typeof(ViewModels.ListAddressViewModel); 

      // 
     // dataGridView1 
     // 
     this.dataGridView1.AllowUserToAddRows = false; 
     this.dataGridView1.AllowUserToDeleteRows = false; 
     this.dataGridView1.AllowUserToOrderColumns = true; 
     this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
     this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
     this.HouseNumber, 
     this.Prefix, 
     this.StreetName, 
     this.StreetType, 
     this.StreetSuffix, 
     this.SecondaryType, 
     this.SecondaryNumber, 
     this.City, 
     this.State, 
     this.ZipCode}); 
     this.dataGridView1.DataBindings.Add(new System.Windows.Forms.Binding("DataSource", this.bindingSource1, "AddressList", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 
     this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; 
     this.dataGridView1.Location = new System.Drawing.Point(0, 50); 
     this.dataGridView1.MultiSelect = false; 
     this.dataGridView1.Name = "dataGridView1"; 
     this.dataGridView1.ReadOnly = true; 
     this.dataGridView1.RowHeadersVisible = false; 
     this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 
     this.dataGridView1.ShowCellErrors = false; 
     this.dataGridView1.ShowCellToolTips = false; 
     this.dataGridView1.ShowEditingIcon = false; 
     this.dataGridView1.ShowRowErrors = false; 
     this.dataGridView1.Size = new System.Drawing.Size(1014, 421); 
     this.dataGridView1.TabIndex = 2; 
     this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged); 

       //Selection Change Handler 
    private void dataGridView1_SelectionChanged(object sender, EventArgs e) 
    { 
     if (dataGridView1.SelectedRows.Count > 0) 
     { 
      _vm.SelectedAddress = (Address)dataGridView1.SelectedRows[0].DataBoundItem; 
     } 
    } 


//My View Model (_vm) 
public class ListAddressViewModel 
{ 
     public IList<Address> AddressList { get; set; } 
     private IAddressRepository _repo; 
     public Address SelectedAddress {get;set;} 

     public ListAddressViewModel() 
     { 
     AddressList = new List<Address>(); 
     } 

     public ListAddressViewModel(IAddressRepository AddrRepo) 
      :this() 
     { 
      _repo = AddrRepo 
      init(); 
     } 

     private void init() 
     { 
     if(_repo != null) 
     { 
      AddressList = _repo.FindAll(); 
     } 
     } 

     ... etc.. 
} 
+0

あなたの 'bindingSource1'オブジェクトと' _vm'は何かを文書化する必要があります。 – LarsTech

+0

Bindingsourceと_vmコードを追加しました。あなたが見ることができるように_vmはViewModelの単純な実装です。 – Scott

+1

私たちが一緒に遊べるソースコードを教えていただけたら幸いですか?おそらく、独自のデータを明らかにしないが、依然として内部にバグが残っている、あなたのプログラムの一部の限定されたサブセットかもしれませんか? – Alexey

答えて

0

おそらくあまり役​​に立ちませんが、問題を再現できませんでした。私が使用したコードを掲載したので、毎回正しい選択ができました。私が作った唯一の変更は、DataGridview1.DataSourceを型の代わりにListAddressViewModelのインスタンスに変更することでした。おそらく、それは私自身の問題を解決しませんでした。それが価値があるもののためのコード!うまくいけばそれは他の誰かを助けるでしょう。 私はフォームコードで修正を行った元のコードをコメントアウトしました。

public class Address 
{ 
    public string AddressLine1 { get; set; } 
    public string City { get; set; } 
    public string PostCode { get; set; } 
} 

public class ListAddressViewModel 
{ 
    public IList<Address> AddressList { get; set; } 
    public Address SelectedAddress { get; set; } 

    public ListAddressViewModel() 
    { 
     AddressList = new List<Address>(); 
     init(); 
    } 


    private void init() 
    { 
     AddressList = new List<Address> 
     { 
      new Address { AddressLine1 = "Address 1", City = "City 1", PostCode = "PostCode 1" }, 
      new Address { AddressLine1 = "Address 2", City = "City 2", PostCode = "PostCode 2" }, 
      new Address { AddressLine1 = "Address 3", City = "City 3", PostCode = "PostCode 3" }, 
      new Address { AddressLine1 = "Address 4", City = "City 4", PostCode = "PostCode 4" }, 
      new Address { AddressLine1 = "Address 5", City = "City 5", PostCode = "PostCode 5" }, 
      new Address { AddressLine1 = "Address 6", City = "City 6", PostCode = "PostCode 6" }, 
      new Address { AddressLine1 = "Address 7", City = "City 7", PostCode = "PostCode 7" }, 
      new Address { AddressLine1 = "Address 8", City = "City 8", PostCode = "PostCode 8" }, 
      new Address { AddressLine1 = "Address 9", City = "City 9", PostCode = "PostCode 9" }, 
      new Address { AddressLine1 = "Address 10", City = "City 10", PostCode = "PostCode 10" }, 
      new Address { AddressLine1 = "Address 11", City = "City 11", PostCode = "PostCode 11" }, 
      new Address { AddressLine1 = "Address 12", City = "City 12", PostCode = "PostCode 12" }, 
      new Address { AddressLine1 = "Address 13", City = "City 13", PostCode = "PostCode 13" }, 
      new Address { AddressLine1 = "Address 14", City = "City 14", PostCode = "PostCode 14" }, 
      new Address { AddressLine1 = "Address 15", City = "City 15", PostCode = "PostCode 15" }, 
      new Address { AddressLine1 = "Address 16", City = "City 16", PostCode = "PostCode 16" }, 
      new Address { AddressLine1 = "Address 17", City = "City 17", PostCode = "PostCode 17" }, 
      new Address { AddressLine1 = "Address 18", City = "City 18", PostCode = "PostCode 18" }, 
      new Address { AddressLine1 = "Address 19", City = "City 19", PostCode = "PostCode 19" } 
     }; 
    } 

} 

public partial class Form3 : Form 
{ 
    private System.Windows.Forms.BindingSource bindingSource1; 
    private ListAddressViewModel VM { get; set; } 
    private DataGridView dataGridView1; 

    public Form3() 
    { 
     InitializeComponent(); 

     this.dataGridView1 = new DataGridView(); 
     this.VM = new ListAddressViewModel(); 
     this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); 
     //this.bindingSource1.DataSource = typeof(ListAddressViewModel); 
     this.bindingSource1.DataSource = this.VM; 

     this.dataGridView1.AllowUserToAddRows = false; 
     this.dataGridView1.AllowUserToDeleteRows = false; 
     this.dataGridView1.AllowUserToOrderColumns = true; 
     this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
     //this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
     // this.AddressLine1, 
     // this.City, 
     // this.PostCode}); 
     this.dataGridView1.DataBindings.Add(new System.Windows.Forms.Binding("DataSource", this.bindingSource1, "AddressList", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 
     //this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; 
     //this.dataGridView1.Location = new System.Drawing.Point(0, 50); 
     this.dataGridView1.Location = new System.Drawing.Point(33, 27); 
     this.dataGridView1.MultiSelect = false; 
     this.dataGridView1.Name = "dataGridView1"; 
     this.dataGridView1.ReadOnly = true; 
     this.dataGridView1.RowHeadersVisible = false; 
     this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 
     this.dataGridView1.ShowCellErrors = false; 
     this.dataGridView1.ShowCellToolTips = false; 
     this.dataGridView1.ShowEditingIcon = false; 
     this.dataGridView1.ShowRowErrors = false; 
     //this.dataGridView1.Size = new System.Drawing.Size(1014, 421); 
     this.dataGridView1.Size = new System.Drawing.Size(345, 150); 
     this.dataGridView1.TabIndex = 2; 
     this.dataGridView1.SelectionChanged += new System.EventHandler(this.dataGridView1_SelectionChanged); 
     this.Controls.Add(this.dataGridView1); 
    } 



    //Selection Change Handler 
    private void dataGridView1_SelectionChanged(object sender, EventArgs e) 
    { 
     if (dataGridView1.SelectedRows.Count > 0) 
     { 
      var addr = (Address)dataGridView1.SelectedRows[0].DataBoundItem; 
      var msg = String.Format("{0}, {1}, {2}", addr.AddressLine1, addr.City, addr.PostCode); 
      MessageBox.Show(msg, "Message", MessageBoxButtons.OK); 
     // _vm.SelectedAddress = (Address)dataGridView1.SelectedRows[0].DataBoundItem; 
     } 
    } 
} 
0

文字住所1 = dataGridView1.SelectedRows [0] .Cells [columnIndexに】.Value.ToString()

列市= dataGridView1.SelectedRows [0] [columnIndexに(.Value.ToStringを.Cells )

文字列郵便番号は= dataGridView1.SelectedRows [0] [columnIndexに] .Value.ToString()このような

2

何か...

 if (dataGridView1.SelectedRows.Count > 0) 
    { 
    _vm.SelectedAddress =(Address)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["Address"].Value.ToString(); 
    } 
.Cells
0

選択した行コレクションではなく、選択した行のインデックスを使用してみます。グリッドの仮想化のためにTelerikのgridviewを使用してこの問題が発生しました。

現在選択されている行のインデックスを使用する方法はたくさんありますが、別の方法もあります。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     //e holds column and row index's selected 
    } 

私はあなたのコードの全体の範囲を知らないので、私は多くを言う傾けます。

関連する問題