2011-02-02 2 views
0

У меня есть DataGridView, который я заполняю из списка. Функция, редактирующая этот список, называется LoadCollectionData()'. Дополнительные строки добавляются в список просто отлично, и соответствующие данные, относящиеся к этой строке, заполняются при добавлении строки.Только верхняя строка обновления DataGridView?

Проблема в том, что в дальнейшем при изменении других данных, которые изменили бы то, что отображается на datagrid, только верхняя строка продолжает обновляться, а все остальные остаются неизменными.

Вот код для метода:

public bool haschanged = false; 

    public class KeywordDensity 
    { 
     public bool included { get; set; } 
     public string keyword { get; set; } 
     public string occurences { get; set; } 
     public string density { get; set; } 
    } 

    public int WordCount(string txtToCount) 
    { 
     string pattern = "\\w+"; 
     Regex regex = new Regex(pattern); 

     int CountedWords = regex.Matches(txtToCount).Count; 

     return CountedWords; 
    } 

    public int KeywordCount(string txtToCount, string pattern) 
    { 
     Regex regex = new Regex(pattern); 

     int CountedWords = regex.Matches(txtToCount).Count; 

     return CountedWords; 
    } 


    public List<KeywordDensity> LoadCollectionData() 
    { 
     string thearticle = txtArticle.Text.ToLower(); 
     string keywordslower = txtKeywords.Text.ToLower(); 
     string[] keywordsarray = keywordslower.Split('\r'); 
     List<KeywordDensity> lsikeywords = new List<KeywordDensity>(); 
     bool isincluded = false; 
     double keywordcount = 0; 
     double wordcount = WordCount(thearticle); 
     double thedensity = 0; 



     foreach (string s in keywordsarray) 
     { 

      if (s != "") 
      { 
       keywordcount = KeywordCount(thearticle, s); 
       thedensity = keywordcount/wordcount; 
       thedensity = Math.Round(thedensity, 4) * 100; 


       if (thearticle.Contains(s)) 
       { 
        isincluded = true; 
       } 
       else 
       { 
        isincluded = false; 
       } 


       lsikeywords.Add(new KeywordDensity() 
       { 
        included = isincluded, 
        keyword = s, 
        occurences = keywordcount.ToString(), 
        density = thedensity.ToString() + "%" 
       }); 

      } 

     } 

     return lsikeywords; 
    } 

    private void txtArticle_TextChanged(object sender, EventArgs e) 
    { 
     if (haschanged == false) 
      haschanged = true; 

     lblWordCountNum.Text = WordCount(txtArticle.Text).ToString(); 

     dataGrid.DataSource = LoadCollectionData(); 

    } 

    private void dataGrid_MouseUp(object sender, MouseEventArgs e) 
    { 
     int cursorpos = 0; 
     string copied = ""; 

     if (dataGrid.CurrentCellAddress.X == 1) //Only grab content if the "Keyword" column has been clicked on 
      copied = " " + dataGrid.CurrentCell.Value.ToString() + " "; 

     cursorpos = txtArticle.SelectionStart; 
     txtArticle.Text = txtArticle.Text.Insert(cursorpos, copied); 
    } 

Что еще более странно, , что, когда я нажимаю на любой из строк, то они немедленно обновить. Однако, если нажимать на строку (если она не является верхней), она не обновляется.

Из-за этого я подозреваю, что может быть какое-то свойство, которое мне нужно установить на самом массиве dataGrid, или мне нужно как-то сообщить каждой строке обновить код.

Что такое сделка?

EDIT: Похоже, что единственная причина, по которой ячейка, на которую нажимали обновления, - это то, что я активно захватываю содержимое из ячейки. Я прокомментировал код ниже, и он прекратил обновление даже после нажатия. Тогда он будет обновлять только значения верхней строки и все.

Код:

//Moved above in EDIT 3 

EDIT 2: Вот класс декларация KeywordDensity:

//Moved above in EDIT 3 

EDIT 3: Добавлено весь schebang.

+0

Как вы назначаете источник данных в сетку – V4Vendetta

+0

Да. Когда текст изменен в основном текстовом поле, я вызываю: dataGrid.Datasource = LoadCollectionData(); – Sootah

+0

ok похоже, что нам нужно увидеть весь код сейчас .. можете ли вы показать его ... –

ответ

1

Я немного изменил код, попробуйте этот код.

string[] keywordsarray = keywordslower.Split 
    (new char[] {'\r','\n' }, StringSplitOptions.RemoveEmptyEntries); 
0

Возможно, вам понадобится Invalidate() элемент управления, чтобы вызвать перерисовку.

+0

Пробовал, что. К сожалению, это не сработало для меня. Я вызвал следующее, чтобы попробовать: dataGrid.DataSource = LoadCollectionData(); dataGrid.Invalidate(); – Sootah

+0

Черт. dataGrid.Refresh(); тоже не делает этого. – Sootah

0

вызов метода DataBind() метода передачи данных. Это нужно делать.

Update

Там в ResetBindings() в этом случае.

+0

Нет метода DataBind. Я использую DataGridView, а не GridView. – Sootah

+0

обновили мой ответ –

+0

К сожалению, у меня тоже нет такого метода. Я использую VS 2010, если это имеет значение. Возможно, это проблема с новыми строками, которые не являются «совершенными» или чем-то еще? Я понятия не имею, возможно ли это, но я просто считаю крайне странным, что все начинают обновляться после того, как я нажимаю на каждый, и этот код, который я включил выше, захватывает значение из выбранной ячейки. Эта проблема сбивает с толку. Спасибо за insta-response, хотя! – Sootah

Смежные вопросы