Tag Array c # winforms - PullRequest
       3

Tag Array c # winforms

2 голосов
/ 06 декабря 2010

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

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

Ответы [ 3 ]

0 голосов
/ 06 декабря 2010

DataGridView не имеет коллекции «Элементы».Чтобы это работало, вам нужно привязать DataGridView к коллекции объектов.Примерно так должно начаться:

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

Вам не нужно хранить индекс строки для каждого элемента в объекте «Tag» - вы можете получить выбранный индекс следующим образом:

int selectedIndex = dataGridView.SelectedCells[0].RowIndex;
0 голосов
/ 06 декабря 2010

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

 // 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 голосов
/ 06 декабря 2010

Вы добавляете строки, используя listView1.Rows.Add(rowArray) в обоих списках кодов.Это опечатка или вы назвали GridView таким образом.

По сути, вы храните индекс электронной почты в свойстве «Tag».

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

Вам необходимо убедиться, что вы делаете то же самое при добавлении элементов в GridView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...