C #, используя глобальный список из другой формы [дубликат]

Я нашел функции, похожие на functools.partial python более полезными в JavaScript:

function partial(fn) {
  return partialWithScope.apply(this,
    Array.prototype.concat.apply([fn, this],
      Array.prototype.slice.call(arguments, 1)));
}

function partialWithScope(fn, scope) {
  var args = Array.prototype.slice.call(arguments, 2);
  return function() {
    return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
  };
}

Почему вы хотите его использовать? Обычная ситуация, когда вы хотите использовать это, - это когда вы хотите привязать this к функции к значению:

var callback = partialWithScope(Object.function, obj);

Теперь, когда вызывается обратный вызов, this указывает на obj. Это полезно в ситуациях событий или для сохранения некоторого пространства, потому что оно обычно делает код короче.

Currying похожа на частичную с той разницей, что функция, возвращаемая currying, принимает только один аргумент (насколько я понимаю, ).

9
задан wulfgarpro 15 December 2012 в 01:53
поделиться

4 ответа

Я обычно использую шаблон дизайна Singleton для чего-то подобного http://en.wikipedia.org/wiki/Singleton_pattern . Я сделаю основную форму, которую приложение запускает под синглоном, а затем создайте аксессоры для форм и элементов управления, которые я хочу коснуться в других областях. Другие формы могут либо получить указатель на элемент управления, который они хотят изменить, либо данные в основной части приложения, которые они хотят изменить.

Другой подход - настроить события на разных формах для обмениваться сообщениями и использовать основную форму как своего рода хаб для передачи сообщений событий из одной формы в другую в приложении.

2
ответ дан ColinCren 3 September 2018 в 14:40
поделиться

Легко: сначала вы можете получить доступ к другой форме следующим образом: (скажем, ваша другая форма Form2)

//in Form 1
Form2 F2 = new Form2();
foreach (Control c in F2.Controls)
         if(c.Name == "TextBox1")
            c.Text = "hello from Form1";

Вот и все, вы просто пишете в TextBox1 в Form2 из Form1.

2
ответ дан GntS 3 September 2018 в 14:40
поделиться

Сделать их Singleton не совсем плохая идея, но лично я бы не стал делать это именно так. Я предпочел бы передать ссылку на другую форму. Вот пример.

Form1 запускает Form2 для открытия. Form2 имеет перегруженный конструктор, который принимает форму вызова в качестве аргумента и предоставляет ссылку на члены Form2. Это решает проблему связи. Например, я обнаружил свойство Label как общедоступное в Form1, которое было изменено в Form2.

При таком подходе вы можете общаться по-разному.

Ссылка для загрузки для примера Project

// Ваша форма1

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2(this);
        frm.Show();
    }

    public string LabelText
    {
        get { return Lbl.Text; }
        set { Lbl.Text = value; }
    }
}

// Ваша форма2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private Form1 mainForm = null;
    public Form2(Form callingForm)
    {
        mainForm = callingForm as Form1; 
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.mainForm.LabelText = txtMessage.Text;
    }
}

alt text http: // demo .ruchitsurati.net / files / frm1.png

alt text http://demo.ruchitsurati.net/files/frm2.png

21
ответ дан this. __curious_geek 3 September 2018 в 14:40
поделиться

Есть еще один способ, если вы не хотите прокручивать элементы управления «ALL», как предположил Джо Дабонс. Сделайте функцию в Form2 и вызовите ее из Form1.

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    public void SetIndex(int value)
    {
        lsbMyList.SelectedIndex = value;
    }
}

public partial class Form1 : Form
{
    public Form2 frm;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        frm=new Form2();
        frm.Show();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm.SetIndex(Int.Parse(textBox1.Text));
    }
}
1
ответ дан user 3 September 2018 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: