Вызов форм списка значений. Ribbon1.cs и Form1.cs - PullRequest
0 голосов
/ 25 октября 2019

Я занимаюсь разработкой приложения VSTO. У меня на Office есть кнопка Ribbon1.cs . и Форма на Form1.cs . Я вызываю форму с помощью кнопки, создавая новую форму:

Form1 MallideVorm = new form Form1 (); // Create a form from Form1
MallideVorm.Show (); // Show the form

У меня есть список в моей форме Windows. Я вставил туда строки:

foreach (Microsoft.SharePoint.Client.File file in fileCol)
{
str = file.Name;

// File.AppendAllText (@ "C: \ install \ CSharp \ tulemus.txt", $ "File name: {str}" + Environment.NewLine); // for testing

foreach (form Form1 in System.Windows.Forms.Application.OpenForms)
{
if (frm.GetType () == typeof (Form1))
{
// RibbonDropDownItem ddItem1 = Globals.Factory.GetRibbonFactory (). CreateRibbonDropDownItem ();
//ddItem1.Label = $ "{str}";

Form1 frmTemp = (Form1) frm;
//ddList.Items.Add(ddItem1);
MallideVorm.addItemToListBoxFiles (file.Name);

}
}
}

Все это делается с помощью кнопки Ribbon1.cs -s. Когда у меня есть форма со списком, я хотел бы иметь в своем Form1.cs : (чтобы вернуть выбранное значение)

private void FormFilesBox_SelectedIndexChanged (object sender, EventArgs e)
{string selectedFile = FormFilesBox.SelectedItem.ToString ();}

Но это не работает. Мне кажется, проблема в том, что я генерирую одну форму A одним нажатием кнопки, но пытаюсь получить значения из другой формы B . Как определить действие из Ribbon1.cs в Form1.cs или наоборот (FormFilesBox_SelectedIndexChanged). Или как я могу ссылаться на одну и ту же форму.

Ответ на предложение Синди: Спасибо, Синди, но я не знаю, как сделать это правильно. Word.interop имеет свои собственные глобальные переменные Ссылка ? View = word-pia Так что если я сделаю несколько public static class Globals {Form1 MallideVorm = new Form1(); }, тогда у меня будут такие ошибки, как:

Код серьезности Описание Файл проектаОшибка состояния подавления строки CS0117 «Ribbon1.Globals» не содержит определения для «ThisAddIn». 470 Активен или определен для «Фабрики» ...

Abount код формы: У меня есть форма Windows В форме Form1. CS дизайн. В Form1.cs это:

public void addItemToListBoxFolder(string item)
        {
            FormFolderBox.Items.Add(item);
        }

        public void addItemToListBoxFiles(string item)
        {
            FormFilesBox.Items.Add(item);
        }


        private void FormFilesBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            //_______________________________________________________Sharepoindist faili alla laadimine ja sealt avamine________________________________________

            string selectedFile = FormFilesBox.SelectedItem.ToString();
            //Here is the question, how to take value from other Form.
          //In Ribbon1.cs it is declared as Form1 MallideVorm = new Form1();  //Creating form from Form1
     //   MallideVorm.Show(); 

            var destinationFolder = @"C:\install\CSharp\TestkaustDoc";
            ClientContext ctx = new ClientContext("https://Some/Some");
            //Configure the handler that will add the header.
            ctx.ExecutingWebRequest +=
            new EventHandler<WebRequestEventArgs>(ctx_MixedAuthRequest);
            //Set the Windows credentials.
            ctx.AuthenticationMode = ClientAuthenticationMode.Default;
            ctx.Credentials = System.Net.CredentialCache.DefaultCredentials;
            // Get a reference to the SharePoint site
            var web = ctx.Web;

            // Get a reference to the document library
            var list = ctx.Web.Lists.GetByTitle("Documents");


            // Get the list of files you want to export. I'm using a query
            // to find all files where the "Status" column is marked as "Approved"
            var camlQuery = new CamlQuery
            {
                ViewXml = @"<View>
                            <Query>
                                <Where>
                                <Eq>
                                    <FieldRef Name=""FileLeafRef"" />
                                    <Value Type=""Text"">" + $"{selectedFile}" + @"</Value>
                                </Eq>
                                </Where>
                                </Query>
                            </View>"
            };
            camlQuery.FolderServerRelativeUrl = "/Some/Shared Documents/Test";
            // Retrieve the items matching the query
            var items = list.GetItems(camlQuery);

            // Make sure to load the File in the context otherwise you won't go far
            ctx.Load(items, items2 => items2.IncludeWithDefaultProperties
                (item => item.DisplayName, item => item.File));

            // Execute the query and actually populate the results
            ctx.ExecuteQuery();

            // Iterate through every file returned and save them
            foreach (var item in items)
            {

                using (FileInformation fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, item.File.ServerRelativeUrl))
                {
                    // Combine destination folder with filename -- don't concatenate
                    // it's just wrong!
                    var filePath = Path.Combine(destinationFolder, item.File.Name);

                    // Erase existing files, cause that's how I roll
                    if (System.IO.File.Exists(filePath))
                    {
                        System.IO.File.Delete(filePath);
                    }

                    // Create the file
                    using (var fileStream = System.IO.File.Create(filePath))
                    {
                        fileInfo.Stream.CopyTo(fileStream);
                    }
                }

            }

Я решил это с помощью:

foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)

Вот так:

В Ribbon.cs ЯСоздание новой формы:

Form1 MallideVorm = new Form1();  //Creating form from Form1

          MallideVorm.Show(); // Showing form

Затем с помощью Application.OpenForms. (потому что форма одна)

foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)
                            {
                                if (frm.GetType() == typeof(Form1))
                                {


                                    Form1 frmTemp = (Form1)frm;

                                   frm.addItemToListBoxFiles(file.Name);

Затем в Form1.cs таким же образом можно получить значения из ListBox.

foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)

            {
                selectedFile =  FormFilesBox.SelectedItem.ToString();

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