【问题标题】:Tag Array c# winforms标签数组 c# winforms
【发布时间】:2010-12-06 04:31:47
【问题描述】:

下面的代码让我可以在列表视图中显示收到的电子邮件,当所选索引发生更改时,会在 RTB 中显示所选电子邮件的正文。问题是我更改了代码以使用数据网格视图,现在标签部分不起作用

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

【问题讨论】:

  • 你说“不会工作”是什么意思?是否存在编译错误、运行时错误,或者事情没有按预期发生(在这种情况下,预期什么?)。我在您的代码中看不到对 DataGridView 的任何引用。
  • 好吧,我不知道在哪里放置 .Tag = i;当我把它放在这里时((dataGridView1.Rows.Add(rowArray);))我得到'int'不包含'Tag'的定义并且没有扩展方法'Tag'接受'int'类型的第一个参数可以被发现(您是否缺少 using 指令或程序集引用?)我是 c# 新手,所以它可能只是一些愚蠢的东西,但我可以弄清楚

标签: c# datagridview tags


【解决方案1】:

我之前已经创建了数据网格视图的代码,但你已经完成了,所以我没有在你的最后一个问题中发布,但我认为,你应该尝试下面的代码。

 // 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");

    }

【讨论】:

  • 嗨 Saurabh 感谢您的帮助,但我收到此错误错误无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?)
  • @Shane121 你考虑过把这个错误输入谷歌吗?
  • 哈哈,是的,我确实修复了它,但现在调试时出现索引超出范围错误
  • 编程让你思考,不是吗?
【解决方案2】:

您在两个代码清单中都使用listView1.Rows.Add(rowArray) 添加行。这是一个错字还是你这样命名了 GridView。

基本上,您将电子邮件的索引存储在“标签”属性中。

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

您需要确保在将项目添加到 GridView 时也这样做。

【讨论】:

  • 是的,这是一个错字,我将如何在网格视图上这样做
  • 就像您将 ListViewItem 用于 ListView 一样,您可以使用 DataGridViewRow 向 DataGridView 添加行。 DataGridViewRow 具有 Tag 属性。
【解决方案3】:

DataGridView 没有“Items”集合。要使其工作,您需要将 DataGridView 绑定到对象集合。这样的事情应该让你开始:

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

您不需要将每个项目的行索引存储在“标签”对象中 - 您可以像这样获取选定的索引:

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

【讨论】:

    猜你喜欢
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多