2009-07-13 96 views
0

我有一個包含datagridview控件的窗體應用程序。 datagridview由xml文件的內容填充。此刻,所有列都顯示爲datagridviewtextboxcolumns。我想選擇一個由特定XML標記填充的數據,並將其內容顯示在datagridviewcombobox列中以及其他兩個選項中。C#Datagridview - 將TextColumn轉換爲ComboBoxColumn

實施例:

<SMS> 
<Number>+447931663542</Number> 
<DateTime>2009-07-12T17:00:02</DateTime> 
<Message>YES</Message> 
<FollowedUpBy>Unassigned</FollowedUpBy> 
<Outcome>Resolved</Outcome> 
</SMS> 

結果標籤是,我想要被顯示爲在DataGridView一個comboboxcolumn的列。例如,如果標籤爲空且不包含任何數據,則我不顯示任何內容,但組合框中填充了3個可供選擇的選項(未解決,已解決,待定)。但是,如果標籤包含數據,我希望該特定項目顯示在組合框中,並且可以選擇其他兩個選項。

幫助實現這一點將不勝感激!

問候,

編輯: 目前我使用此代碼:

 colOutcome = new DataGridViewComboBoxColumn(); 
     colOutcome.HeaderText = "Outcome"; 
     colOutcome.Width = 90; 
     colOutcome.Items.AddRange("Resolved", "Unresolved", "Pending"); 
     this.dataGridView1.Columns.Insert(1, colOutcome); 
     this.dataGridView1.Columns[1].Name = "OutcomeColumn"; 

上面這段代碼填充組合框。問題是:當xml文檔填充datagridview時,結果列僅顯示爲文本列,其中包含xml文件中結果標記之間的數據。我的觀點是,我怎樣才能得到datagridview,當它讀取結果列,它需要改變成一個組合框,然後顯示數據的方式,以及在組合框中的其他潛在可選擇的選項?!目前datagridview填充所有列作爲textboxcolumns包含數據,以及一個單獨的combobox列這不是我想要的。我需要應用程序將結果列及其數據與上面的代碼合併。

任何想法?

回答

0

更新回答

你可以在XML文檔中傳遞給一個函數,將通過每個節點循環,並確定它是否應該是一個組合框或不即,如果名稱是「結果」。

private void CreateColumns(XmlDocument doc) 
{ 
    foreach (...) // loop through each node in xml document 
    { 
     if (node.Name == "Outcome") 
     { 
       var items = new List<string>() { "Resolved", "Unresolved", "Pending" }; 
       this.dataGridView1.Columns.Add(CreateComboBoxColumn(node.Name, items)); 
     } 
     else 
     { 
       this.dataGridView1.Columns.Add(String.Format("col{0}", node.Name), node.Name); 
     } 
    } 
} 

然後你創建成果列代碼將是:

private DataGridViewComboBoxColumn CreateComboBoxColumn(string colHeaderText, List<string> items) 
{ 
    var colOutcome = new DataGridViewComboBoxColumn(); 
    colOutcome.HeaderText = colHeaderText; 
    colOutcome.Width = 90; 
    colOutcome.Items.AddRange(items.ToArray()); 
    colOutcome.Name = String.Format("col{0}", colHeaderText); 
    return colOutcome; 
} 

你會那麼只需撥打窗體加載事件CreateColumns並傳遞你的XML。您只需要創建一次列。

我的建議是有一個類似的功能,將找到所有的SMS元素,並添加一個新的行填充每個節點的信息。

public void MyForm_Load(object sender, EventArgs e) 
{ 
    var doc = new XmlDocument(filename); 
    CreateColumns(doc); 
    CreateRows(doc); 
} 

希望有所幫助。

+0

哪裏的CheckBoxColumn參考從何而來?請謹慎使用此代碼,因爲它將在DataGridView類型爲DataGridViewComboBoxCell的每列上調用。 – 2009-07-13 12:23:47

+0

Typo本來是ComboBoxCell!是的,它會在每個被單擊的單元格上調用,但只會由ComboBoxCells單元格處理。 – James 2009-07-13 12:31:21

0

我不坐在VS面前,所以這可能不會編譯,但應該給你方向。

您需要在設計時使用3-4個可能值預先填充ResolvedColumn,或者在運行時將其分配給另一個數據源。如果您選擇了設計時方法,只需打開DataGridView的「編輯列」對話框,找到ResolvedColumn,轉到項目並添加值(「」,「未解決」,「待定」,「已解決」)。如果有可能使用沒有結果的SMS記錄呈現網格,則空值可能有助於ComboBox呈現。

要綁定在運行時可能的選項做這樣的事:

private List<string> _outcomeDataSource; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    _outcomeDataSource = new List<string>; 
    _outcomeDataSource.Add(""); 
    _outcomeDataSource.Add("Unresolved"); 
    _outcomeDataSource.Add("Pending"); 
    _outcomeDataSource.Add("Resolved"); 

    ResolvedColumn.DataSource = _outcomeDataSource; 
    ResolvedColumn.PropertyName = "Outcome"; 
} 
0

回答#2對我來說,基於更新後的問題。

您遇到的問題是DataGridView的AutoGeneratedColumns功能。在數據綁定之前,您需要手動創建列。這可以在設計時或運行時完成。我更喜歡設計時間,因爲它給了你更多的方向與網格的外觀/感覺,但任何一種方式的作品。

你需要禁用網格的AutoGeneratedColumns屬性:

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Define your columns at run-time here if that's what you prefer 

    this.dataGridView1.AutoGeneratedColumns = false; 
    this.dataGridView1.DataSource = myDataSource; 
}