2015-07-20 50 views
0

我有一個DataGridView允許用戶同時在多行中設置一個值,方法是首先選擇幾行並從上下文菜單中選擇一個值。通過遍歷所有選定的行,將每行的適當列設置爲指定的值,從而實現這一目標。如果DataGridView沒有按照被修改的列進行排序,那麼效果很好,但如果試圖修改排序列中的值,則經常會有一些值沒有被更改。在DataGridView中編輯排序列值

所以,如果我有一個像由第三列以下排序表:

x x T* x 
x x T* x 
x x T* x 
x x F x 
x x F x 

你想設置在第三列的所有值設爲「F」,你應該能夠選擇前三行,並設置第三列的值設置爲「F」,但我認爲情況是,作爲在選定行中的程序重複他們改變順序,你經常結了:

x x T* x 
x x F* x 
x x F* x 
x x F x 
x x F x 

什麼,我認爲是發生的是「SelectedRow」列表是由索引定義的,如果行是在遍歷「SelectedRows」時重新排列,這會導致某些行將其值設置爲兩次,而其他行則根本沒有設置它們的值。是否有可能暫停重新排序,直到迭代完成,還是有另一種方法確保每個選定的行只修改一次?

編輯:順便說一句,將列「SortMode」設置爲「NotSortable」似乎沒有幫助。

如:

DataGridViewColumnSortMode temp = dgv[currenttab].Columns["column"].SortMode; 
dgv[currenttab].Columns["column"].SortMode = AataGridViewColumnSortMode.NotSortable; 

foreach (DataGridViewRow row in dgv[currenttab].SelectedRows) { 
    row.Cells["column"].Value = "F"; 
} 

dgv[currenttab].Columns["colour"].SortMode = temp; 

繁瑣,因爲它是它仍然有同樣的問題。

回答

0

對不起,我不允許評論,但你有沒有嘗試循環SelectedRows集合的索引呢?通過顯式引用索引,該行出現在SelectedRows集合中的順序應該不再重要。

例如,

for (int index = 0; index < SelectedRows.Count; index ++) 
{ 
    SelectedRows.SelectedRow[index].column[column] = newValue; 
} 
+0

我沒有試過,但我看不到它的工作。 我認爲問題在於,當您更改'排序依據'列的值時,行最終會更改其'索引'。所以,當你改變行'1'的值時,它變成了行'4'(這樣它最終在列表中第二次寫入),並且不同的(未修改的)行被壓入索引1,這就是行最終滑落。 然而,我會給它一個去,如果它能工作,將會驚喜!) – Slartibartfast

+0

好吧,只是試過它,唉,不,如果有什麼更糟糕的:哭 - 傷心: – Slartibartfast

0

我看,比較遺憾的是:(一個其他的想法,我不得不用蠻力解決它添加一個計數器變量,像這樣:

Do until (x == SelectedRows.Count) 
{ 
for each(DataGridViewRow row in dgv[currenttab].SelectedRows)  
{ 
if(row.Cells["column"].Value != newValue) 
{ 
row.Cells["column"].Value == newValue; 
x+=1; 
} 

這樣,每次更改都會讓您在計數器變量中跟蹤它,然後您不斷重複該操作,直到每個選定的行已更改爲止。

+0

我嘗試了類似的東西,它幾乎工作。 上述實現的一個問題是,並非所有行都必須被修改(因爲您可以選擇一些恰好具有所需值的行,因此不需要更改),在這種情況下,它會卡住永遠在循環中。 – Slartibartfast

+0

我採用的'蠻力'方法是遍歷所有選定的行,並只記錄是否有任何更改。如果有任何行被修改,則會再次遍歷它們,直到它設法遍歷所有行而不作任何修改。但是,即使這種可怕的方法也不行!作爲一項測試,我選擇了除第一行以外的所有行,並且很失望地看到所有行都被修改了。 – Slartibartfast

+0

我懷疑發生了什麼事是,其中一個行被修改後,它被重新安排到'第一'位置和未選中的行(這是第一個位置)被移動到選擇,並最終得到修改' bruit force'重新循環。 我不相信這是如此困難。我真的認爲這將是一件非常簡單的事情。 – Slartibartfast

0

我有一個很simil使用C#的問題。我發現了兩件應該有所幫助的事情。首先,這個循環:

Do until (x == SelectedRows.Count) 
{ 
    for each(DataGridViewRow row in dgv[currenttab].SelectedRows)  
    { 
    if(row.Cells["column"].Value != newValue) 
    { 
     row.Cells["column"].Value == newValue; 
     x+=1; 
    } 

不可靠的,因爲你設置的排序列到一個新的價值,它可以移動到新的位置在網格中的瞬間,和SelectedRows收集變得實質上破壞工作。如果你解決這個問題,例如通過以反向索引順序進行迭代,如果您知道修改可能會在表中稍後移動一行或多行,您仍會遇到問題,因爲在以編程方式更改排序關鍵字時,所選行無法正確排序;一些行移動到正確的新位置,有些不行!

我在MSDN上遇到這個帖子: Selected Row in DataGridView is not properly sorted

Amro在帖子中的回覆建議在選擇之外設置DataGridView的CurrentCell屬性。爲了使這項工作,我不得不多做一點:

  1. CurrentCell以外的地方SelectedRows
  2. 修改行。現在,新值正確應用於右側行,但是其中一行出現在網格中的錯誤位置。
  3. 通過設置任意一個單元格的所有行來修復此迭代的當前狀態。
  4. 重新選擇用戶在移動後仍然希望被選中的行。

真是太好了!