Kontrolki DataGridView - przesuwanie wierszy

0

Cześć wszystkim,

Mam kontrolkę DatagridView1 do której pobierane są dane z bazy danych SQL. Kontrolka zawiera 4 kolumny i nieokreśloną liczbę wierszy, następnie tworzę przy użyciu pętli "for" kolumny w datagridView2 identyczne jak w datagridView1. Zaznaczając myszką wiersz w kontrolce DataGridView1 za pomocą przycisku przenoszę go do kontrolki DataGridView2. I teraz mam problem... dodałem kolejny przycisk który powinien zaznaczony wiersz przenieść do góry jednak tak się nie dzieje i wywala wyjątek "System.ArgumentOutodRangeException"Index was out of range...". Co ciekawe w kontrolce gridview1 przesuwanie wierszy działa. proszę o pomoc...

namespace prg
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Przycisk pobierz
        public void button1_Click(object sender, EventArgs e)
        {
            string danepolaczenia;
            SqlConnection polaczeniezbaza;

            danepolaczenia = @"dane:)";

            polaczeniezbaza = new SqlConnection(danepolaczenia);
            polaczeniezbaza.Open();

            SqlCommand komenda;
            String sql;
            sql = @"SELECT....";

            komenda = new SqlCommand(sql, polaczeniezbaza);
            SqlDataAdapter da = new SqlDataAdapter(komenda);
            DataTable dt = new DataTable();
            da.Fill(dt);
            dataGridView1.DataSource = dt;

            komenda.Dispose();
            polaczeniezbaza.Close();

            for (int i = 0; i < dataGridView1.Columns.Count; i++)
            {
                dataGridView2.Columns.Add(dataGridView1.Columns[i].Name, dataGridView1.Columns[i].HeaderText);
            }
        }
	//Przycisk przenies
        private void button2_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.SelectedRows)
            {
                dataGridView2.Rows.Add(row.Cells[0].Value.ToString(), row.Cells[1].Value.ToString(), row.Cells[2].Value.ToString(), row.Cells[3].Value.ToString());
            }
        }
        //Przycisk do góry
        public void button3_Click(object sender, EventArgs e)
        {
             DataTable dt2 = new DataTable();
            dataGridView2.DataSource = dt2;

            int wierszIndeks = dataGridView2.SelectedCells[0].OwningRow.Index;
            if (wierszIndeks == 0)
                return;

            var tabela = (DataTable)dataGridView2.DataSource;

            DataRow nowyWiersz = tabela.NewRow();
            nowyWiersz.ItemArray = tabela.Rows[wierszIndeks].ItemArray;

            tabela.Rows.RemoveAt(wierszIndeks);
            tabela.Rows.InsertAt(nowyWiersz, wierszIndeks - 1);

            dataGridView2.ClearSelection();
            dataGridView2.Rows[wierszIndeks - 1].Selected = true;
        }
    }
}
0

Słabe to.
Poczynają od wycieku połączenia SQL na każdym kliku.
Już pominę nieczytelne button3_Click

Nie wiem jakie uzytkowe zachowanie (wysokiego poziomu) chcesz uzyskac z tymi kolumnami, ale to wygląda jak kopanie się z koniem.
Zlepek fragmentów z róznych artykułow z netu.

Poczytaj czym mogą być zasilane Gridy, czyli wzorzec Model / View, tam jest rozwiązanie 90% twoich problemów. Obecnie coś im wpychasz do gardła w niezrozumiały dla mnie sposób

0
AnyKtokolwiek napisał(a):

Słabe to.
Poczynają od wycieku połączenia SQL na każdym kliku.
Już pominę nieczytelne button3_Click

Nie wiem jakie uzytkowe zachowanie (wysokiego poziomu) chcesz uzyskac z tymi kolumnami, ale to wygląda jak kopanie się z koniem.
Zlepek fragmentów z róznych artykułow z netu.

Poczytaj czym mogą być zasilane Gridy, czyli wzorzec Model / View, tam jest rozwiązanie 90% twoich problemów. Obecnie coś im wpychasz do gardła w niezrozumiały dla mnie sposób

Rozumiem ;). Przy okazji mógłbyś coś więcej dodać chociażby na temat "wycieku połączenia".

1 użytkowników online, w tym zalogowanych: 0, gości: 1