2013-04-15 130 views
9

我在綁定到地址列表的WinForm應用程序中有一個datagrid。地址列表很長,所以我必須滾動來選擇我想要的地址。但是,在滾動並找到我想要的地址並將其選中後,數據網格將選擇表格第一次加載時位於網格中相同位置的地址。我想知道我做錯了什麼,以及如何得到我想要的結果。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

字符串AddressLine1 = dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString()

字符串市= dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString( )

字符串郵編= dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString()

2

像這樣...

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

嘗試使用行的選定索引而不是所選行集合。由於網格的虛擬化,我在使用Telerik的gridview時遇到了一個問題。

有很多方法可以用來選擇當前行的索引,但這也是另一種方法。

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

我不能多說,因爲我不知道你的代碼的整個範圍。