【问题标题】:How can i send the items from a ListView by email ( xamarin.forms )如何通过电子邮件 (xamarin.forms) 从 ListView 发送项目
【发布时间】:2020-08-04 11:27:03
【问题描述】:

我正在使用:https://docs.microsoft.com/en-us/xamarin/essentials/email?tabs=android 通过电子邮件发送数据。

我现在可以发送普通字符串,但我很难弄清楚如何从我的列表视图发送数据,并像图片一样格式化它们(每个项目一行)。

如果有人能给我一个关于如何做到这一点的想法,将不胜感激。

注意:我只需要每个 ListView 项目中的文本。

非常感谢。

我的 ListView 代码

                    <ListView x:Name="listView" ItemsSource="{Binding Tasks}" HasUnevenRows="True" SelectionMode="None">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                    <Frame Margin="0,5,0,5">
                                        <Grid>

                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                                <ColumnDefinition Width="*" />
                                            </Grid.ColumnDefinitions>
                                            <Label Grid.Column="0" Margin="0" Text="{Binding TasksGroup.TasksGroupDate, StringFormat='{0:yyyy-MM-dd}'}" FontSize="12" FontAttributes="Bold" TextColor="Black"/>
                                            <Label Grid.Column="1" Margin="0" Text="{Binding TaskDescription}" FontSize="12" FontAttributes="Bold" TextColor="Black" />
                                            <Label Grid.Column="2" Margin="0" Text="{Binding TaskDuration}" FontSize="12" FontAttributes="Bold" TextColor="Black" />
                                            <Label Grid.Column="3" Margin="0" Text="{Binding TaskDBA}" FontSize="12" FontAttributes="Bold" TextColor="Black"/>
                                        </Grid>
                                    </Frame>
                                </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

我的发送电子邮件方法包含其他易于实施的数据,因为它不是列表视图项目

private async void EmailButtonClicked(object sender, EventArgs e)
{

    var message = new EmailMessage
    {
        Subject = "Résultat d'exposition quotidienne",
        Body = DureeTotal.Text + " " + SumTotalHours.Text + h.Text + Environment.NewLine + Environment.NewLine + LeqText.Text + " " + LeqResult.Text + dBA.Text
        + Environment.NewLine + Environment.NewLine + ExpositionResultText.Text + " " + ExpositionResult.Text + dBA8.Text + output
    };
    await Email.ComposeAsync(message);
}

我的页面 ViewModel 包含一组任务和一个任务组(它们是生成所需数据的属性)

class ResultPageViewModel : BaseViewModel
{
    private ObservableCollection<Tasks> tasks;
    public ObservableCollection<Tasks> Tasks
    {
        get
        {
            return tasks;
        }
        set
        {
            tasks = value;
            NotifyPropertyChanged();
        }
    }

    private TasksGroup tasksGroup;
    public TasksGroup TasksGroup
    {
        get => tasksGroup;
        set
        {
            tasksGroup = value;
            NotifyPropertyChanged();
        }
    }


    public ResultPageViewModel(TasksGroup tasksGroup)
    {
        
        TasksGroup = tasksGroup;
        var data = TasksGroup.Taches;
        Sum = TimeSpan.Zero;

        Tasks = new ObservableCollection<Tasks>(data);
        TasksGroup.Taches.ForEach(x =>
        {
            TaskDBA = x.TaskDBA;
            TaskDuration = x.TaskDuration;
            TaskDescription = x.TaskDescription;

            var TaskGroupDuration = Helper.GetDuration(x.TaskDuration);

            Sum = Sum.Add(TaskGroupDuration);
        });
        SumTotalHours += Math.Round(Sum.TotalHours, 4);

        LeqResult = CalculateLeq(tasksGroup);
    }

    public double CalculateLeq(TasksGroup group)
    {
        return Math.Round(10 * Math.Log10((1/SumTotalHours)*group.Taches.Sum(x =>
Helper.GetDuration(x.TaskDuration).TotalHours * Math.Pow(10, Convert.ToDouble(x.TaskDBA) / 10.0))), 1);
    }

}

【问题讨论】:

  • Essentials 电子邮件功能不适用于在正文中发送格式丰富的数据。你也许可以让它工作,但我不推荐它。创建文档并将其添加为附件或使用外部电子邮件服务会更好
  • 我不在乎它是否有钱,我只想从中获取数据。另外,您有什么好的建议来创建您所说的文档吗?
  • 使用 PDF 库构建 PDF。或者只是建立一个包含您的数据的字符串并将其作为电子邮件的正文传递

标签: c# xamarin xamarin.forms


【解决方案1】:

您可以将ListView的数据转换成Json字符串,然后作为邮件正文发送。

如以下代码将ObservableCollection&lt;Tasks&gt;转换为Json字符串:

using Newtonsoft.Json;  

ResultPageViewModel pageViewModel = new ResultPageViewModel();
string output = JsonConvert.SerializeObject(pageViewModel.Tasks);

现在output 字符串可以作为电子邮件正文发送。

【讨论】:

  • 感谢您的回复,我在应用解决方案时收到此错误stackoverflow.com/questions/13510204/…,并使用此链接修复它。获得输出后,如何获取数据并逐行格式化以重新创建 ListView 体验?再次感谢
  • 我可以这样做:var results = JsonConvert.DeserializeObject(output);然后是示例:结果[0].TaskDate 但是如果列表视图项目编号总是不同怎么办?如何在不逐行索引和格式化​​它们的情况下全部输出它们谢谢:)
  • @codetime 也可以将result转换回ObservableCollection&lt;Tasks&gt;,如:ObservableCollection&lt;Tasks&gt; deserializedProduct = JsonConvert.DeserializeObject &lt;ObservableCollection&lt;Tasks&gt;&gt;(output);
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2017-01-06
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多