Как можно назвать Таблицы Набора данных, которые Вы возвращаете в сохраненном proc?

Пример GUI:

Предположим, что у меня есть GUI:

import tkinter as tk

root = tk.Tk()

btn = tk.Button(root, text="Press")
btn.pack()

root.mainloop()

Что происходит при нажатии кнопки

См., когда btn нажата, вызывает свою собственную функцию , которая очень похожа на button_press_handle в следующем примере:

def button_press_handle(callback=None):
    if callback:
        callback() # Where exactly the method assigned to btn['command'] is being callled

с:

button_press_handle(btn['command'])

Вы может просто предположить, что параметр command должен быть установлен как ссылка на метод, который мы хотим назвать, аналогичный callback в button_press_handle.


Вызов метода ( Callback ) Когда кнопка нажата

Без аргументов

Итак, если я хотел print что-то при нажатии кнопки I необходимо установить:

btn['command'] = print # default to print is new line

Обратите внимание на недостаток в () с помощью метода print, который опущен в том смысле, что: " Это имя метода, которое я хочу, чтобы вы вызывали при нажатии, но не вызываете его именно в этот момент ». Однако я не передал никаких аргументов для print, поэтому он печатал все, что он печатает, когда без аргументов.

W ith Аргумент (ы)

Теперь Если бы я хотел также передать аргументы методу, который я хочу называть при нажатии кнопки, я мог бы использовать анонимные функции, которые могут быть созданы с помощью оператора lambda , в этом случае для встроенного метода print, например:

btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)

Вызов Несколько методов при нажатии кнопки

Без Аргументы

Вы также можете добиться этого с помощью оператора lambda, но он считается плохим и поэтому я не буду включать его здесь. Хорошей практикой является определение отдельного метода multiple_methods, который вызывает нужные методы, а затем устанавливает его как ответ на нажатие кнопки:

def multiple_methods():
    print("Vicariously") # the first inner callback
    print("I") # another inner callback

С Аргумент (s)

Чтобы передать аргумент (ы) методу, который вызывает другие методы, снова используйте инструкцию lambda, но сначала:

def multiple_methods(*args, **kwargs):
    print(args[0]) # the first inner callback
    print(kwargs['opt1']) # another inner callback

, а затем установите :

btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)

Возвращаемый объект (ы) из обратного вызова

Также обратите внимание, что callback не может реально return, потому что он только вызывается внутри button_press_handle ] с callback() в отличие от return callback(). Это делает return, но не вне этой функции. Таким образом, вам лучше изменить объект (ы), которые доступны в текущей области.


Полный пример с global Модификация объекта (ов)

Ниже приведен вызов метода, который меняет текст btn при каждом нажатии кнопки:

import tkinter as tk

i = 0
def text_mod():
    global i, btn           # btn can be omitted but not sure if should be
    txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
    btn['text'] = txt[i]    # the global object that is modified
    i = (i + 1) % len(txt)  # another global object that gets modified

root = tk.Tk()

btn = tk.Button(root, text="My Button")
btn['command'] = text_mod

btn.pack(fill='both', expand=True)

root.mainloop()

Зеркало

37
задан Brann 26 February 2009 в 10:32
поделиться

3 ответа

Насколько я знаю от сохраненного proc, Вы не можете сделать этого. Можно, однако, определить имена, как только Вы получили DataSet и затем используете их с тех пор.

ds.Tables[0].TableName = "NametbA";
32
ответ дан David Wengier 10 October 2019 в 09:21
поделиться

Есть ли какая-либо причина, которую Вы не можете назвать ими вручную в честь заполнения DataSet?

mySqlDataAdapter.Fill(ds);
ds.Tables[0].TableName = "NametbA";
ds.Tables[1].TableName = "NametbB";

я не знаю ни о каком способе назвать DataTables, которые возвращаются как часть нескольких наборов результатов из хранимой процедуры, но если Вы знаете то, что сохраненный proc возвращает тогда вручную, именование их должно хорошо работать.

Редактирование

Знание, что Вы управляете хранимой процедурой, одна альтернатива, могло бы быть должно добавить столбец к наборам результатов, который представляет имя таблицы. Тогда Вы могли бы быть в состоянии сделать что-то как:

foreach (DataTable table in ds.Tables)
{
    table.TableName = table.Rows[0]["TableName"].ToString();
}

Однако это полагается на наборы результатов, возвращающиеся из хранимых процедур, на самом деле содержащих строки. Если бы они не содержат строки тогда, необходимо было бы обернуть его в, "если" оператор и не каждая таблица получит имя.

6
ответ дан Matt Hamilton 10 October 2019 в 09:21
поделиться

У меня это работает, но мне нужна дополнительная работа, чтобы получить ожидаемые имена таблиц:

    Dim tableCount As Integer = 3
    Dim tables(tableCount) As DataTable
    tables(0) = (New DataTable("Employee"))
    tables(1) = (New DataTable("Manager"))
    tables(2) = (New DataTable("Department"))
    dsUControlData.Tables.Add(tables(0))
    dsUControlData.Tables.Add(tables(1))
    dsUControlData.Tables.Add(tables(2))

    'Fill required tables
    da.Fill(0, 0, tables)

    Return dsUControlData
0
ответ дан 27 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

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