我使用C#和telegram.bot并希望创建动态private static InlineKeyboardMarkup InlinePostsKeyboard;
private static List<string> PostsTitle;
...
PostsTitle = (from p in dba.BlogPosts select p.Subject).Take(4).ToList();
var inlineButtons = PostsTitle.Select(title => new[] { InlineKeyboardButton.WithCallbackData(title, title) }).ToArray();
InlinePostsKeyboard = new InlineKeyboardMarkup(inlineButtons);
...
Bot.SendTextMessageAsync(Chat.Id, e.Message.Text, replyMarkup: InlinePostsKeyboard);`
....Take(4).ToList();
正如您在上面的代码中看到的那样,大多数显示4个InlineKeyboardButton(每行),但没有显示任何内容!
只需将from Django.db import models
class Product(models.Model):
barcode = models.CharField(max_length=200, primary_key=True)
quantity = models.IntegerField()
更改为3或小于4(例如:3,2或1),您将看到按钮将正确显示
我想知道原因 我在哪里弄错了?
答案 0 :(得分:3)
如果内联键盘行/按钮的数量有限制,则肯定超过3。
Log&amp;检查您发送给Telegram API的内容。我怀疑你的一篇博文p.Subject
返回空字符串或太长的字符串或Telegram不允许的内容。
同时确保您正在使用的库正确转义值(例如替换"
等特殊字符)
顺便说一下,为什么你会将帖子主题传递给callback_data
?将帖子ID传递给像post?id=123
这样的东西不是更好吗?
答案 1 :(得分:1)
在一个按钮行中,您最多可以容纳8个按钮。如果您有8个以上的按钮,则必须将它们放在多行中。
我编写了一个(TypeScript)实用程序函数来拆分按钮数组:
evenlySplitArray<T>(arrayToSplit: T[]): T[][] {
if (!Array.isArray(arrayToSplit)) {
return [[]];
}
const length = arrayToSplit.length;
// Last row can contain one element more.
const maxElementsPerRow = 5;
const numberOfRows = Math.ceil(length / maxElementsPerRow);
const elementsPerRow = Math.round(length / numberOfRows);
const result = [];
for (let i = 0; i < numberOfRows; i++) {
// Add remainder to last row
const end = i === numberOfRows - 1 ? length : (i + 1) * elementsPerRow;
const split = arrayToSplit.slice(i * elementsPerRow, end);
result.push(split);
}
return result;
}
callback_data
的限制为1-64个字节,例如JWT不适合。