@andrey71
админю и учу C#, ASP.NET Core

Как разместить динамические кнопки в telegram в колонку?

Добрый день!
Подскажите пожалуйста, как разместить динамические кнопки в telegram в колонку?
Суть в следующем: боту отправляется запрос, он отвечает на него не сообщением, а кнопками. Кнопок может быть разное количество, не фиксированное.
Я нашел подобную задачу, но там кнопки выводятся в строку.
Вот так получается:
5d2999e6b5521942005099.png
Переписать код под нужный результат - не получилось.

В документации к api я примера не нашел.
Если вы генерировали кнопки InlineKeyboardButton динамически, подскажите как Вы это делали.
Спасибо!
  • Вопрос задан
  • 2791 просмотр
Решения вопроса 1
@andrey71 Автор вопроса
админю и учу C#, ASP.NET Core
Не совсем это ответ конечно, но из положения вышел так. (после долгих попыток)

В цикле, который читает значения из базы я разместил такой код:
var inlineKeyboard = new InlineKeyboardMarkup(new[] { new[] { InlineKeyboardButton.WithCallbackData(rdrValue, rdrValue) } });
await Bot.SendTextMessageAsync(message.Message.Chat.Id, "-->", replyMarkup: inlineKeyboard);


Тем самым получил в принципе желаемый результат.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@no5carry
Если нужно по одной кнопке в строке : {keyboard: [["A"], ["B"], ["C"]]}
Если много кнопок в строке: {keyboard: [["A", "B", "C"],["D","E"]]}
Хз как это будет на Шарпе, думаю как-то так

private static InlineKeyboardButton[][] GetInlineKeyboard(string [] stringArray)
{
var keyboardButtons = new InlineKeyboardButton[stringArray.Length];
for (var i = 0; i < stringArray.Length; i++)
{
btn = new InlineKeyboardButton
{
Text = stringArray[i],
CallbackData = "Some Callback Data",
};
keyboardButtons[i] = [btn];
}
return keyboardButtons;
}

var buttonItem = new[] { "one", "two", "three", "Four" };
var keyboardMarkup = new InlineKeyboardMarkup(GetInlineKeyboard(buttonItem));
Ответ написан
@ambal245
В php можно использовать функцию array_chunk которая разбивает массив на группы. Пример обработки следующий.
$input_array = array('Ivan', 'Петя', 'Даша', 'Зоя', 'Борщ');
$students = [];
$k = 0;
foreach ($input_array as $key) {
$students[$k] = [
"text" => $key
];
$k++;
}
$keyboard = array('inline_keyboard' => array_chunk($students, 2));
$replyMarkup = json_encode($keyboard);

В результате получится массив кнопок
{"inline_keyboard":[[{"text":"Ivan"},{"text":"Петя"}],[{"text":"Даша"},{"text":"Зоя"}],[{"text":"Борщ"}]]}

Вывод будет по 2 кнопки в строчку
Ответ написан
Комментировать
@FirstAfterGod2501
Как-то так я попытался. Работает исправно
List<InlineKeyboardButton[]> list = new List<InlineKeyboardButton[]>(); // Создаём массив колонок
            for(int i =0;i<5;++i){ // Можно использовать и foreach
                InlineKeyboardButton button = new InlineKeyboardButton() { CallbackData = "Data", Text = i.ToString() };//Создаём кнопку
                InlineKeyboardButton[] row = new InlineKeyboardButton[1] { button }; // Создаём массив кнопок,в нашем случае он будет из одного элемента
                list.Add(row);//И добавляем его
            }
            var inline = new InlineKeyboardMarkup(list);//создаём клавиатуру
            await Bot.SendTextMessageAsync(message.Message.Chat.Id, "-->", replyMarkup: inline);//отправка
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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