簡體   English   中英

滾動后,Datagrid正在選擇錯誤的行

[英]Datagrid is selecting the wrong row after scrolling

我在WinForm應用程序中有一個綁定到地址列表的數據網格。 地址列表很長,所以我必須滾動選擇我想要的地址。 但是,在我滾動並找到我想要的地址並選擇它之后,數據網格將在首次加載表單時選擇網格上位於相同位置的地址。 我想知道我做錯了什么,怎么可能得到我想要的結果。

    // 
// 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..
}

像這樣的東西......

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

可能不是一個非常有用的答案,但我無法復制你的問題。 我發布了我使用過的代碼,每次都得到了正確的選擇。 我做的唯一改變是將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;
        }
    }
}

String AddressLine1 = dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString()

String City = dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString()

String PostCode = dataGridView1.SelectedRows [0] .Cells [Columnindex] .Value.ToString()

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

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

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

我不能說更多,因為我不知道你的代碼的整個范圍。

暫無
暫無

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

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