InlineKeyboardMarkup - biroz boshqacharoq tushuncha. Uning yordami bilan biz murakkab amallarni bajarishimiz mumkin bo'ladi.
Bu turdagi klaviaturani hosil qilishda InlineKeyboardButton sinfiga mansub obyektlardan foydalaniladi. InlineKeyboardButton bir vaqtning o'zida ham tugma matnini, hamdaunga biriktirilgan datani olib yuradi. Ya'ni, bu data orqali, botimizni keyingi vazifalarini belgilashimiz mumkin.
public string Index()
{
// yangi event_handler yasaldi
client.OnMessage += Xabar_Kelganda;
//inline button bosilganda hosil
// bo'ladigan event_handler
client.OnCallbackQuery += CallBack;
// xabar kelishini tasdiqlash
client.StartReceiving();
return "Bot hozr ishlamoqda";
}
// callbackquery event_hand
private async void CallBack(object sender, CallbackQueryEventArgs e)
{
if(e.CallbackQuery.Data == "A bosildi")
await client
.SendTextMessageAsync(e.CallbackQuery.From.Id, e.CallbackQuery.Data);
}
private async void Xabar_Kelganda(object sender, MessageEventArgs e)
{
if (e.Message.Text == "test")
{
var markup = new InlineKeyboardMarkup(
new InlineKeyboardButton[][]
{
new InlineKeyboardButton[]
{
InlineKeyboardButton
.WithCallbackData(text: "A", callbackData: "A bosildi"),
InlineKeyboardButton
.WithCallbackData(text: "B", callbackData: "B bosildi")
},
new InlineKeyboardButton[]
{
InlineKeyboardButton
.WithCallbackData(text: "C", callbackData: "C bosildi"),
InlineKeyboardButton
.WithCallbackData(text: "D", callbackData: "D bosildi")
}
}
);
await client.SendTextMessageAsync(
chatId: e.Message.Chat.Id,
text: "1 - test",
replyMarkup: markup
);
}
}
Natija:
OnCallBackQuery - InlineKeyboardButton bosilganda hosil bo'ladigan xodisa hisoblanadi. Ko'rib turganingizdek biz ham bu xodisa ishlagan paytda, CallBack() deb nomlangan event_handler funksiyaga murojaat qilishni ko'rsatib qo'ydik.
InlineKeyboardButton sinfiga mansub bir nechta metodlar mavjud, yuqoridagi misolda WithCallbackData() ko'rinishidan foydalanildi. Ushbu metoddan joy olgan callbackData maydoni orqali keyingi vazifani belgilashga muvaffaq bo'ldik.
E'tiborli bo'ling, callbackdata maydoni - 1 - 64 baytgacha bo'lgan oraliqni qabul qila oladi.
Endigi navbatda, tugmalarni dinamik holatda hosil qilishni ko'rib chiqamiz.
if (e.Message.Text == "tugmalar")
{
// jagged massivini hosil qilish
InlineKeyboardButton[][] button = new InlineKeyboardButton[2][];
button[0] = new InlineKeyboardButton[5];
button[1] = new InlineKeyboardButton[5];
for (int i = 0; i < 10; i++)
{
if (i < button[0].Length)
{
// 1 - massiv
button[0][i] = new InlineKeyboardButton
{
Text = (i + 1).ToString(),
CallbackData = (i + 1).ToString()
};
}
else
{
// 2 - massiv
button[1][i - button[0].Length] = new InlineKeyboardButton
{
Text = (i + 1).ToString(),
CallbackData = (i + 1).ToString()
};
}
}
var markup = new InlineKeyboardMarkup(button);
await client.SendTextMessageAsync(
chatId: e.Message.Chat.Id,
text: "Tugmalar",
replyMarkup: markup
);
}
Natija:
Tugmalarni 2 ta ustunda ham hosil qilishimiz mumkin. Endi, boshqacharoq yo'l bilan hosil qilib ko'ramiz
if (e.Message.Text == "tugmalar")
{
List<InlineKeyboardButton> buttons = new List<InlineKeyboardButton>();
for (int i = 0; i < 10; i++)
{
buttons.Add(new InlineKeyboardButton
{
Text = (i + 1).ToString(),
CallbackData = (i + 1).ToString()
});
}
var twoMenu = new List<InlineKeyboardButton[]>();
for (var i = 0; i < buttons.Count; i ++)
{
if (buttons.Count - 1 == i)
{
twoMenu.Add(new[] { buttons[i] });
}
else
twoMenu.Add(new[] { buttons[i], buttons[i + 1] });
i++;
}
var markup = new InlineKeyboardMarkup(twoMenu.ToArray());
await client.SendTextMessageAsync(
chatId: e.Message.Chat.Id,
text: "Tugmalar",
replyMarkup: markup
);
}