C# Экспорт Datagridview в документ Word

Я использую следующий код для экспорта выбранных строк из DatagGridview в документ Word. Код работает, но есть одна проблема. Сначала экспортируется последняя строка, и я не могу придумать, как сделать так, чтобы она экспортировалась по порядку. Например, если я выберу строку [0,1,2,3], будет экспортирована строка [3], чем [2] и [1]. Любые идеи, в чем проблема?

public void WordDoc(string getfilename)
        {



            object FileName = getfilename;


            //Create word Application Object
            Word.Application word = new Word.Application();

            //Create word document Object
            Word.Document doc = null;

            //Create word Missing Object
            object missing = System.Type.Missing;

            object readOnly = false;
            object isVisible = false;
            // make visible Word application
            word.Visible = true;

            try
            {
                doc = word.Documents.Open(ref FileName, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing);
                doc.Activate();    
foreach (DataGridViewRow rows in dataGridView1.SelectedRows)
                        {
                        string item1 = rows.Cells[0].Value.ToString();
                                string item2 = rows.Cells[2].Value.ToString();
                                string item3 = rows.Cells[3].Value.ToString();
                                string item4 = rows.Cells[4].Value.ToString();
                                string item5 = rows.Cells[5].Value.ToString();
                                string item6 = rows.Cells[6].Value.ToString();
                                string item7 = rows.Cells[7].Value.ToString();
                                string item8 = rows.Cells[8].Value.ToString();
                                string item9 = rows.Cells[9].Value.ToString();
                                string item10 = rows.Cells[10].Value.ToString();
                                string item11 = rows.Cells[11].Value.ToString();
                                string item12 = rows.Cells[12].Value.ToString();

                                this.FindAndReplace(word, "!0!", item1);
                                this.FindAndReplace(word, "!1!", item2);
                                this.FindAndReplace(word, "!2!", item3);
                                this.FindAndReplace(word, "!3!", item4);
                                this.FindAndReplace(word, "!4!", item5);
                                this.FindAndReplace(word, "!5!", item6);
                                this.FindAndReplace(word, "!6!", item7);
                                this.FindAndReplace(word, "!7!", item8);
                                this.FindAndReplace(word, "!8!", item9);
                                this.FindAndReplace(word, "!9!", item10);
                                this.FindAndReplace(word, "!10!", item11);
                                this.FindAndReplace(word, "!11!", item12);
                        }
}
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message);
            }
        }



            private void FindAndReplace(Word.Application word, object findText, object replaceText)
            {
                word.Selection.Find.ClearFormatting();
                object matchCase = true;
                object matchWholeWord = true;
                object matchWildCards = false;
                object matchSoundsLike = false;
                object matchAllWordForms = false;
                object forward = true;
                object format = true;
                object matchKashida = false;
                object matchDiacritics = false;
                object matchAlefHamza = false;
                object matchControl = false;
                object read_only = false;
                object visible = true;
                object replace = 1;
                object wrap = 2;

                word.Selection.Find.Execute(ref findText, ref matchCase,
                ref matchWholeWord, ref matchWildCards, ref matchSoundsLike,
                ref matchAllWordForms, ref forward, ref wrap, ref format,
                ref replaceText, ref replace, ref matchKashida,
                ref matchDiacritics,
                ref matchAlefHamza, ref matchControl);
        }       

1 ответ

Решение

Я думаю, что этот Linq должен работать (вам нужно using System.Linq; вверху файла ".cs".):

var orderedRows = from DataGridViewRow row in dataGridView1.SelectedRows
                  orderby row.Index
                  select row;

foreach (DataGridViewRow row in orderedRows)
    ...

[РЕДАКТИРОВАТЬ] Немного больше информации в соответствии с просьбой OP:

Это использует Linq для сортировки возвращаемых строк в порядке индекса каждой строки.

Смотрите эту документацию для введения в Linq

Но вкратце, как это работает так:

Во-первых, следует понимать, что DataGridView.SelectedRows возвращает строки в том порядке, в котором они были выбраны пользователем.

Чтобы получить их в правильном порядке, нам нужно отсортировать их по каждой строке .Index имущество.

Линк выше делает это, говоря:

Msgstr "Возьмите все строки в dataGridView1.SelectedRows и упорядочите их по свойству Index каждой строки, а затем верните все строки в этом порядке".

Но это слишком сложно, чтобы вдаваться в подробности здесь; Вы должны будете прочитать введение в Linq, которое я отправил!

Другие вопросы по тегам