2010-12-06 5 views
2

以下のコードは、選択したインデックスが変更されたときにlistviewで受け取った電子メールを表示して、選択した電子メールの本文をRTBに表示します。問題は、私はデータグリッドビューで動作するようにコードを変更し、現在はタグの部分は文句を言わない仕事である タグ配列c#winforms

void SomeFunc() // This line added by Jon 
{ 
    int i; 

    for (i = 0; i < bundle.MessageCount; i++) 
    { 
     email = bundle.GetEmail(i); 

     ListViewItem itmp = new ListViewItem(email.From); 
     ListViewItem.ListViewSubItem itms1 = 
      new ListViewItem.ListViewSubItem(itmp, email.Subject); 
     ListViewItem.ListViewSubItem itms2 = 
      new ListViewItem.ListViewSubItem(itmp, email.FromName); 
     itmp.SubItems.Add(itms1); 
     itmp.SubItems.Add(itms2); 

     listView1.Items.Add(itmp).Tag = i; 

     richTextBox1.Text = email.Body; 
    } 

    // Save the email to an XML file 
    bundle.SaveXml("email.xml"); 
} 

private void listView1_SelectionChanged(object sender, EventArgs e) 
{ 
    if (listView1.SelectedCells.Count > 0) 
    { 
     // bundle is now accessible in your event handler: 
     richTextBox1.Text = bundle.GetEmail((int)listView1.SelectedCells[0].Tag).Body; 
    } 
} 

コードデータグリッドビューのために

int i; 

for (i = 0; i < bundle.MessageCount; i++) 
{ 
    email = bundle.GetEmail(i); 

    string[] row = new string[] { email.From, email.Subject, email.FromName }; 
    object[] rows = new object[] { row }; 

    foreach (string[] rowArray in rows) 
    { 
     dataGridView1.Rows.Add(rowArray); 
    } 
} // This line added by Jon 
+0

「仕事がない」とはどういう意味ですか?コンパイルエラー、ランタイムエラー、または期待どおりに起こっていないことはありますか(この場合は、何が期待されていますか?)。私はあなたのコードでDataGridViewへの参照を見ることができません。 –

+0

まあ、どこに.Tag = i;私はそれを置くときにライン((dataGridView1.Rows.Add(rowArray);))私は 'int'は、 'タグ'の定義を含んでいないし、 'int'のタイプの最初の引数を受け入れる拡張メソッド 'タグ'を含まない(使用している指示やアセンブリの参照がありませんか?) 私はそれがprobなので何かばかげているが、私はそれを理解することができる – Shane121

答えて

0

List<Email> emails = new List<Email>(); 
for (i = 0; i < bundle.MessageCount; i++) 
{ 
    email = bundle.GetEmail(i); 
    emails.Add(email); 
} 
dataGridView.ItemsSource = emails; 

あなたは「タグ」オブジェクト内の各アイテムの行のインデックスを格納する必要はありませんすることができますが、このような選択されたインデックスを取得することができます

私はDataGridビューのコードを以前に作成しましたが、すでに完了していますので、最後の質問には投稿していませんが、以下のコードを試してください。

// i am creating a new object here but , you can have a single object on the form 
    DataGridView dgv = new DataGridView(); 

    private DataTable EmailSource { get; set; } 


     dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 
     dgv.SelectionChanged+=new EventHandler(dgv_SelectionChanged); 



     Chilkat.MessageSet msgSet = imap.Search("ALL", true); 
     if (msgSet != null) 
     { 
      bundle = imap.FetchBundle(msgSet); 


      CreateDataTable(); 

      if (bundle != null && dt!=null) 
      { 
       Chilkat.Email email; 
       int i; 
       for (i = 0; i < bundle.MessageCount; i++) 
       { 
        email = bundle.GetEmail(i); 
        if(email!=null) 
        { 
        DataRow drow = EmailSource.NewRow(); 
        drow["Id"] = i.ToString(); 
        drow["From"] = email.FromName; 
        drow["Subject"] = email.Subject; 
        drow["DateRecived"] = email.DateRecived; 
        // i am adding email body also 
        drow["Body"] =email.Body; 
        EmailSource.Rows.Add(drow); 
        } 
       } 

       // Save the email to an XML file 
       bundle.SaveXml("email.xml"); 



       dgv.DataSource= EmailSource; 

       // Hiding Body from the grid 
       dgv.Columns["Body"].Visible =false; 



      } 
     } 

    // this event handler will show the last selected email. 
    void dgv_SelectionChanged(object sender, EventArgs e) 
    { 
     DataGridViewSelectedRowCollection rows = dgv.SelectedRows; 
     if (rows != null) 
     { 
      // get the last selected row 
      DataRow drow = rows[rows.Count - 1].DataBoundItem as DataRow; 

      if (drow != null) 
      { 
       richTextBox1.Text = drow["Body"]; 
      } 

     } 
    } 

    private void CreateDataTable() 
    { 
     EmailSource = new DataTable(); 
     EmailSource.Columns.Add("Id"); 
     EmailSource.Columns.Add("From"); 
     EmailSource.Columns.Add("Subject"); 
     EmailSource.Columns.Add("DateRecived"); 
     EmailSource.Columns.Add("Body"); 

    } 
+0

こんにちはSaurabh助けていただきありがとうございますが、私はこのエラーが発生します。エラー\t 'オブジェクト'を暗黙的に '文字列'に変換できません。明示的な変換が存在します(キャストがありませんか?) – Shane121

+0

@ Shane121 Googleにこのエラーを入力することを検討しましたか? –

+0

答えは:http://tinyurl.com/24ercks –

0

あなたはコードの両方でlistView1.Rows.Add(rowArray)を使用して行を追加していますリスト。これはタイプミスですか、そういう名前のGridViewですか?

基本的には、電子メールのインデックスを「タグ」プロパティに格納しています。

listView1.Items.Add(itmp).Tag = i; 

GridViewにアイテムを追加するときも同じ操作を行う必要があります。

+0

それはtypoよりもむしろ私がグリッドview – Shane121

+0

ListViewにListViewItemを使用しているのと同じように、DataGridViewに行を追加するためにDataGridViewRowを使用できます。 DataGridViewRowにはTagプロパティがあります。 – Hps

0

DataGridViewには「アイテム」コレクションがありません。動作させるには、DataGridViewをオブジェクトのコレクションにバインドする必要があります。このような何かあなたが始める必要があります: - :

int selectedIndex = dataGridView.SelectedCells[0].RowIndex;