DataGrid

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by F&D, 24 Aug 2010.

  1. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Доброго времени суток, товарищи.

    Как возможно реализовать ссылку в хедере таблицы, подобно тому, как это реализовано на скриншоте(DELETE ALL)?

    [​IMG]


    Есть такой код. Первое событие должно удалять только строки, по нажатии на ссылку DELETE(как на рисунке вверху), а второе событие, должно удалять полностью всё содержимое таблицы по нажатии на DELETE ALL. Но, работает это все не корректно. Поясню как именно не корректно - если нажимаю DELETE - удаляется всё содержимое, хотя должна удалятся только строка, в которой я нажал DELETE.
    Code:
    private void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)   
           {   
                 int index = dataGridView1.CurrentRow.Index;  
                 if (index != -1) 
                 dataGridView1.Rows.RemoveAt(index);                  
           }            
    private void DataGridView_CellClick(object sender,  DataGridViewCellEventArgs e)         
          {     
                dataGridView1.Rows.Clear();                      
          }
    
    Помогите пожалуйста с таблицей(первая часть поста) и с не корректно работающим кодом.. :(

    Заранее спасибо.
     
  2. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    Code:
            private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.RowIndex != -1)            
                dataGridView1.Rows.RemoveAt(e.RowIndex);
            }
    
            private void dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
                dataGridView1.Rows.Clear();
            }
     
  3. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Огномное спасибо, работает.

    А, как возможно реализовать ссылку в хедере(как на рисунке header - Delete All)?
     
  4. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Установить тип последнего Column в DataGridViewLinkColumn , если уж с EventArgs то можно и так ((DataGridView)sender).Rows.RemoveAt(e.RowIndex)

    UPD.
    У последнего Column придется менять Cell.Style, e.g. -

    LastColumnName.HeaderCell.Style.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(204)));


    LastColumnName.HeaderCell.Style.ForeColor = System.Drawing.Color.Blue;
     
    #4 PaCo, 25 Aug 2010
    Last edited: 25 Aug 2010
  5. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Спасибо. Буду сейчас разбираться.
     
  6. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Извините за назойливость, но появился еще один вопрос.. у меня все получилось. НО появилась маленькая проблемка.

    [​IMG]

    Вот рабочая прога. Проблемка в том, что при нажатии по ссылке, к примеру "football ua" - удаляется вся строка, хотя это должно происходить, только по нажатию Delete.

    Как исправить и сделать, чтобы открывалось в WebBrowser?
     
  7. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Нужно смотреть на индекс ячейки, то есть он должен быть 2 для удаления и 0 для перехода
    PHP:
            private void dataGridView_CellContentClick(object senderDataGridViewCellEventArgs e)
            {
                if (
    e.RowIndex !=-1)
                {         
                 if(
    e.ColumnIndex==2dataGridView1.Rows.RemoveAt(e.RowIndex);
                 else if(
    e.ColumnIndex==0)
                 {
                   
                    
    webBrowser_Object.Navigate(((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());

                 }
                }
            }
    Хотя для перехода лучше создать .CellContentDoubleClick event.
     
    #7 PaCo, 25 Aug 2010
    Last edited: 25 Aug 2010
  8. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Уважаемый PaCo, можно у Вас еще проконсультироваться(и у остальных тоже)? Есть код:
    Code:
    private void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)      
    {          
    if (e.RowIndex != -1)        
     {             
     if (e.ColumnIndex == 2) dataGridView1.Rows.RemoveAt(e.RowIndex);              
    else if (e.ColumnIndex == 0) 
     {             
        webBrowser1.Navigate(((DataGridView)sender).Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());              
    }          
    }     
     }
    [​IMG]

    А как правильно распарсить элемент WebBrowser, чтобы в нем выводилось только - <Title>День независимости на Kiss и т.д., <link> и <pubDate>.
     
  9. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    Code:
            private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
            {
                HtmlDocument html = this.webBrowser1.Document;
                HtmlElementCollection col = html.GetElementsByTagName("Title");
                foreach(HtmlElement element in col)
                Console.WriteLine(element.InnerText);
            }
    вместо "Title" можно подставлять любые теги.
     
  10. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Сдедал событием, не работает :(
    Так же и выдает, как выдавало до этого.

    Пробовал даже вместо Console.WriteLine(element.InnerText); ставить MessageBox.Text(element.InnerText); - выпадает просто пустое сообщение :(
     
  11. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    а как выдавало до этого?

    кинь url сайта. можно в личку.
     
  12. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Я хотел сказать, что сначало сглупил, не поставил событие.. в результате ничего не происходило, а когда добавил - просто выскакивало message и всё.

    url легко - http://football.ua/rss2.ashx
     
  13. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Зачем тут вообще WebBrouser? В C# есть более-менее нормальная поддержка парсинга xml, вот пример (пускай и не самый лучший) с готовым проектом.
     
    1 person likes this.
  14. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    хехе, конечно не идёт. т.к. это не html document.
    тут, как уже сказак пако, нужно работать с xml.
     
  15. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Т.е. сохранить в xml и потом уже парсить?
     
  16. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    нет, зачем же?
    можно всё делать находу:
    Code:
    XmlTextReader reader = new XmlTextReader("http://football.ua/rss2.ashx");
    while (reader.Read())
    {
        switch (reader.Name)
        {
            case "title":
                Console.WriteLine(reader.ReadString());
                break;
            case "link":
                Console.WriteLine(reader.ReadString());
                break;
        }                
    }
     
  17. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    C этим разобрался, спасибо.

    Возможно последний вопрос..
    Как реализовать парсинг xml не по заданной ссылке(http://football.ua/rss2.ashx), а по нажатии на ссылку в таблице(рисунок выше)?

    Пробовал разными способами, не один не получился. :(
     
  18. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    интересно, какие ты способы испробовал :rolleyes:

    вот:
    Code:
     private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                XmlTextReader reader = new XmlTextReader(dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString());
                while (reader.Read())
                {
                    switch (reader.Name)
                    {
                        case "title":
                            Console.WriteLine(reader.ReadString());
                            break;
                        case "link":
                            Console.WriteLine(reader.ReadString());
                            break;
                    }
                }
            }
    или ещё лучше:
    Code:
    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                XmlTextReader reader = new XmlTextReader((sender as DataGridView)[e.ColumnIndex,e.RowIndex].Value.ToString());
                while (reader.Read())
                {
                    switch (reader.Name)
                    {
                        case "title":
                            Console.WriteLine(reader.ReadString());
                            break;
                        case "link":
                            Console.WriteLine(reader.ReadString());
                            break;
                    }
                }
            }
     
  19. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Спасибо. Пробовал практически так же, только забыл про добавление [e.ColumnIndex,e.RowIndex]



    Осталось дело за малым, реализовать это все с помощь БД.
    Еще раз, спасибо!!!
     
  20. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Вот итоговая программа. Пытаюсь сохранить DataGrid в БД(MS SQL Sever) и не могу понять как...
    [​IMG]

    Есть пример, но

    Code:
     private void button1_Click(object sender, EventArgs e)
            {
                {
                    string connStr = @"DefaultDir=C:\temp;Driver={Microsoft Text Driver (*.txt; *.csv)}";
                    
                    OdbcConnection conn = new OdbcConnection(connStr);
                   // try
                    {
                        conn.Open();
                       //DataTable dt = new DataTable();
                        OdbcCommand cmd = new OdbcCommand("select * from ", conn);
                        OdbcDataReader reader = cmd.ExecuteReader();
                        while (reader.Read())
                            textBox1.Text += reader["*"].ToString() + "\r\n";
                    }
                 //   catch (OdbcException)
                    {
                        MessageBox.Show("Файл не найден");
                    }
                   // finally
                    {
                        conn.Close();
                    }
                }
            }
    
    Это я делал по извлечению из файла, а как можно используя этот код(если он подходит) реализовать по извлечению из таблицы DataGrid(чтобы все изменения происходящие в DataGrid происходили и в БД)?


    P.S. Еще я думал может через сам проект создать базу? Как будет проще? :(
     
    #20 F&D, 2 Sep 2010
    Last edited: 2 Sep 2010